建议60:重新引发异常时使用Inner Exception

部署运行你感兴趣的模型镜像

建议60:重新引发异常时使用Inner Exception

当捕获了某个异常,将其包装或重新引发异常的时候,如果其中包含了Inner Exception,则有助于程序员分析内部信息,方便代码调试。

以一个分布式系统为例,在进行远程通信的时候,可能会发生的情况肯能会有:

1)网卡被禁用或者网线断开,此时会抛出SocketException,消息问:“由于目标机器积极拒绝,无法连接。”

2)网络正常,但是要链接的目标主机没有端口没有处在监听状态,此时会抛出SocketException,消息为:“由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。”

3)链接超时,此时需要通过代码实现关闭链接,并抛出SocketException,消息为:“链接超过约定的时长。”

发生以上三种情况的任何一种情况,在返回给最终用户的时候,我们都需要将异常信息包装成为“网络连接失败,请稍后再试”。

所以,一个分布式系统的业务处理方法,看起来应该是这样的:

复制代码
            try
            {
                SaveUser(user);
            }
            catch (SocketException ex)
            {
                throw new CommunicationFailureException("网络连接失败,请稍后再试", ex);
            }
复制代码

在提示这条信息的时候,我们可能需要将原始异常记录到日志里,以供开发者分析具体原因(如果这种情况频繁出现,就可能是一个Bug)。在记录日志时,非常有必要记录此异常出现的内部异常或是堆栈信息。

throw new CommunicationFailureException("网络连接失败,请稍后再试", ex);就是将异常包装成为一个CommunicationFailureException,并将SocketException作为InnerException(即ex)向上传递。

如果不打算使用InnerException,但是要返回一下额外的信息,可以使用Exception的Data属性。如下:

复制代码
            try
            {
                SaveUser(user);
            }
            catch (SocketException ex)
            {
                ex.Data.Add("SocketInfo","网络连接失败,请稍后再试");
                throw ex;
            }
复制代码

在上层进行捕获的时候,可以通过键值来得到异常信息:

            catch (SocketException ex)
            {
                Console.WriteLine(ex.Data["SocketInfo"]);
            }

 

 

 

转自:《编写高质量代码改善C#程序的157个建议》陆敏技

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值