毫无疑问,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. XML与DataSet相互转换,DataSet查询

    以FileShare.Read形式读XML文件: string hotspotXmlStr = string.Empty; try { Stream fileStream = new FileStre ...

  2. Tair分布式key/value存储

    [http://www.lvtao.net/database/tair.html](特别详细)   tair 是淘宝自己开发的一个分布式 key/value 存储引擎. tair 分为持久化和非持久化 ...

  3. Extjs Google的Suggest的自动提示 从后台取数据

    //服务器取数据 var remoteStore = Ext.create('Ext.data.Store', { proxy: ({ type: "ajax", url:&quo ...

  4. Queue and Message

    #ifndef __QUEUE_H__ #define __QUEUE_H__ #include <stdint.h> #include <stdlib.h> #include ...

  5. 以优美方式编写JavaScript代码

    英文原文:CoffeeScript: The beautiful way to write JavaScript 我用 JavaScript 编程很多年了,写了大量的 JavaScript 代码,即便 ...

  6. HttpWebRequest post请求获取webservice void数据信息

    private void button2_Click(object sender, EventArgs e) { Hashtable ht = new Hashtable(); ht["sc ...

  7. Linux进程通信之System V消息队列

    System V消息队列是Open Group定义的XSI,不属于POSIX标准.System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的 ...

  8. freemarker中的round、floor和ceiling数字的舍入处理

    freemarker中的round.floor和ceiling数字的舍入处理 1.简易说明 (1)round:四舍五入 (2)floor:向下取整 (3)ceiling:向上取整 2.举例说明 < ...

  9. 【JavaScript】Object.observe()带来的数据绑定变革

    Object.observe()带来的数据绑定变革 引言 一场变革即将到来.一项Javascript中的新特性将会改变你对于数据绑定的所有认识.它也将改变你所使用的MVC库观察模型中发生的修改以及更新 ...

  10. [Express] Level 3: Reading from the URL

    City Search We want to create an endpoint that we can use to filter cities. Follow the tasks below t ...