毫无疑问,Exception有很多优点。查看任何一本面向对象的书籍,都会提到异常相对于返回值标记状态的不足以及避免错误导致程序崩溃的问题。看起来是很好的,用起来也是很好的。可是这么多年过去了,异常用的并不是很好,甚至有点不知所谓。最近用异常有点感觉,所以拿出来分享一下。

首先说之前异常用起来没有感觉的原因:

  1. 异常能发现问题,却并不能很好的解决问题。比如,某个方式封装了打开数据连接的操作,内部调用一个打开数据库的库函数,此刻函数抛出了连接异常。异常可以方便调试,可是即使捕获到重试,依然不能解决问题。如果想在此函数捕获异常后重新尝试打开,还得限制重试次数,避免死循环。在重试或者处理过之后,还得反馈给外部进行处理。
  2. 函数出现异常了,然后呢?当我们对别人的库进行一下封装的时候,为了不暴露封装库,甚至直接将异常捕获,用函数返回值替代了异常。既然体会不到异常的好处,又多写了代码。重新抛出异常好像也是一件浪费时间的事情。
  3. 一些不好示范。不习惯异常的可能更多的是C/C++等程序员,总是喜欢0,-1,1。好一点的会将0,-1转换为false,1转换为true。用起来也没有什么不好,可是不知道false的具体含义。虽然在Debug时,会有栈追踪,却始终是放弃了异常的好处。很多年前见过我师兄简单封装的Apache的一个java SQL 访问的包(DBUtil),就是这么干的。甚至,连事务都被其干掉了。
  4. 不要吞食异常。在使用一些硬件公司(即使是我们选用的知名的硬件公司)提供的.Net SDK基本上都来自对C/C++的最基本封装——可是说只是转换了签名。每当我使用这样的SDK,真让人崩溃。风格自然不用说,还喜欢吞食异常。吞食异常的后果就是,你永远无法知道SDK是否出错,或者到底哪里出错。硬件公司的.Net SDK风格一方面可能来自于其对C/C++的简单封装,根本无异常;另一方面也可能由于于他们没有定义好或者描述好错误。以下是吞食异常的一个示例:
    //example code
    try
    {
    dosomething(); //will throw exception.
    }
    catch(Excetpion ex)
    {
    //log.... or other things
    // or do nothing
    }

我一直在想怎么用好异常,最近用起来感觉比较顺手,大概有这么几点心得:

  • 如果这个类方法对其具体实现的异常(比如调用了其他库抛出的异常)不敢兴趣,那么就不用理会,当作什么都不知道。除非需要捕获异常进行记录,并封装,抛出自己定义的异常,才捕获它们。
  • 类方法只是执行实体,不是控制实体,异常抛出后,如何处理应该由控制器来进行逻辑处理。
  • 对于自己实现的类方法,应该主动的抛出异常,让客户知道发生了什么错误。最简单的就是 throw new Exception("what is wrong....")
  • 在功能性方法中处理异常没有任何意义,还会其他客户端带来困惑。比如打开串口异常时存在重试逻辑,那么该方法可能会卡住。该方法的客户端需要知晓该方法的处理逻辑。

如果你的方法对异常不感兴趣,或者你无法处理它,就不要关注它。如果你需要抛出新异常,大胆的throw就好,只需要将exception说明加入到注释即可。将异常交给其使用者处理,是非常好的一件事情。

/// <summary>
/// 函数说明
/// </summary>
/// <param name="content"></param>
/// <exception cref="System.Exception">将抛出异常..</exception>
public void SayHello(param content[])

参考:

[1]《译<异常最佳实践>》, http://www.cnblogs.com/jjseen/p/5922852.html

[2].Net最佳实践, (美)Stephen Ritchine 著, p75-80, 机械工业出版社

关于使用Exception的一点心得的更多相关文章

  1. WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信

    原文:WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信 最近工作需要,学习了一下winform内嵌webbrowser控件,然后与htm页面中的javasc ...

  2. 使用Webbrowser的一点心得体会

    原文:使用Webbrowser的一点心得体会 自从用上VS2005后,发现多了个WebBrowser控件(.net 2003中不带),为图方便吧,有好多小工具就用这个写的,慢慢也有点体会了,总结一下, ...

  3. 谈谈选用技术的原则,技术学习方法技巧,阅读代码的技巧及其它 MSF的一点心得

    谈谈技术原则,技术学习方法,代码阅读及其它(正文) 这篇文章是前一阵在水木BBS上和别人讨论中偶自己发言的摘编,是偶这几年开发过程完全经验式的总结.完全个人经验,供批判. 一.选用技术的原则 比较规范 ...

  4. 【并行计算与CUDA开发】基于NVIDIA显卡的硬编解码的一点心得 (完结)

    原文:基于NVIDIA显卡的硬编解码的一点心得 (完结) 1.硬解码软编码方法:大体流程,先用ffmpeg来读取视频文件的包,接着开启两个线程,一个用于硬解码,一个用于软编码,然后将读取的包传给解码器 ...

  5. SVM一点心得体会

    支持向量机的学习说是刚刚开始,又不合理,只能说隔了很长的时间再看,终于在分类这块的层面上有了新的认识. 总的来说,支持向量机分为线性支持向量机和非线性支持向量机,线性支持向量机又可以分为硬间隔最大化线 ...

  6. 记录自己对EventLoop和性能问题处理的一点心得

    1.EventLoop 这里说的EventLoop不是指某一个具体的库或是框架,而是指一种程序实现结构.这种结构多是基于IO多路转接的API(select.poll.epoll之类)以reactor模 ...

  7. 从Eclipse转移到IntelliJ IDEA一点心得

    http://www.ituring.com.cn/article/37792 本人使用IntelliJ IDEA其实并不太久,用了这段时间以后,觉得的确很是好用.刚刚从Eclipse转过来的很多人开 ...

  8. Android平板上开发应用的一点心得——精确适配不同的dpi和屏幕尺寸

    一.引言 Android的开源使厂商无需自行研发OS,大大降低了研发.生产的成本,使得Android平板品牌如雨后春笋般爆发,山寨机厂商们似乎又找到了一丝希望.与此同时带来的是广大开发者的苦不堪言,各 ...

  9. 在Web api2 中传递复杂参数的一点心得

    这两天在做的一个项目基于webapi2,期间遇到了复杂参数传递的问题.其中刚好看到园友的这篇文章,但是我测试收结果是失败的,还不知道是什么原因.最终经过思考后,找到了一种方法,和大家分享下. 在前端我 ...

随机推荐

  1. NISSAN 尼桑 J1962 诊断座

    J1962诊断座: J1962/16 ........ 常火线 +BATJ1962/  8 ........ 点火开关打开信号 +IGNJ1962/  5 ........ 发动机搭铁线; 逻辑地J1 ...

  2. [CentOS]CentOS/RedHat/Fedora的Proxy设定(yum,wget,,rpm)

    yum 「/etc/yum.conf」 proxy=http://proxy.xxx.com:8080/ wget 「/etc/wgetrc」 http_proxy=http://proxy.xxx. ...

  3. codeforces Gym 100187A A. Potion of Immortality

    A. Potion of Immortality Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/1001 ...

  4. WinForm特效:拦截窗体上各个部位的点击

    windows窗体的标题栏无法直接通过一些默认的事件来控制,需要了解和WM_NCHITTEST相关的windows消息. 以下示例演示了最简单的效果片断: 他会把客户区和标题栏的效果互换,比如无法按住 ...

  5. C#中的ICollection接口

    一.集合类: 1.1 ICollection接口 前面我们学习了数组,这是.net Framework定义的最基本的集合类型,除过数组外,.net Framework还另外定义了很多集合类型以满足编程 ...

  6. Android游戏背景音乐音效音量控制

    游戏音效就是我们在玩游戏时出现的音乐,这个也是每个游戏必备的一部分,但有是你做游戏的背景音乐有间断的感觉的话,我们可以用 getCurrentPosition()这个方法来判断一下声音播放的偏移.其实 ...

  7. Android6.0动态权限申请步骤以及需要注意的一些坑

    因为工作需要,简单研究了一下Android6.0权限申请,在Google提供的sample的基础上,写了一个简单的demo.算是自己的笔记吧,可能会比较混乱,主要是方便以后查看.后期有别的问题,随时更 ...

  8. Android Task 与 Back Stack

    Tasks and Back Stack 一个应用通常包括多个 activity.每个 activity应用设计为围绕针对执行用户特定的行为和可以启动其它 activity. 一个 Activity也 ...

  9. 你真的会使用SQL Server的备份还原功能吗?之一:恢复模型

    在SQL Server中,除了系统数据库外,你创建的每一个数据库都有三种可供选择的恢复模型: Simple(简单), full(完整), bulk-logged(批量日志). 下面这条语句可以显示出所 ...

  10. Linux下判断cpu物理个数、几核

    自己服务器的输出 1. 查看物理CPU的个数   #cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l    1 2. 查 ...