建议60:重新引发异常时使用Inner Exception
来源:互联网 发布:聚划算数据 编辑:程序博客网 时间:2024/06/04 00:11
建议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个建议》陆敏技
- 建议60:重新引发异常时使用Inner Exception
- c# 中的内部异常(inner Exception)
- 正确使用Exception异常处理
- 【系列】重新认识Java语言——异常(Exception)
- 引发异常
- 建议68:从System.Exception或其他常见的基本异常中派生异常
- 异常(exception)
- 异常:Exception
- Exception 异常
- 异常Exception
- 异常--Exception
- 异常(exception)
- 异常Exception
- 异常 Exception
- exception异常
- Exception异常
- Exception 异常
- 异常Exception
- Hostapd的安装与使用
- SQL删除语句同时向备份表插入数据
- PIL----crop()和paste()
- uVision4新建工程及软件仿真调试
- zzuli 1918 G
- 建议60:重新引发异常时使用Inner Exception
- 读STM32F4xx中文参考手册笔记(一)
- iOS开发多线程篇—GCD介绍
- 速度传感器
- Javascript的5中基本类型
- 'keytool' 不是内部或外部命令,也不是可运行的程序
- solve the error : Could not open lock file /var/lib/apt/lists/lock
- [CS231n@Stanford] Assignment1-Q2 (python) SVM实现
- BP算法之一种直观地解释