我们写程序时经常遇到错误处理的情况,尤其是面向用户的应用程序(区别于面向开发人员的组件,类库)。笔者经常在写ASP.NET应用程序的时候,经常在返回错误代码和抛出异常之间徘徊,犹豫。即舍不得抛出错误代码这种方式的简洁,方便,又唯恐不使用抛出异常从而违反了.NET的设计准则。比方说,我们要写一个删除用户的方法,那么这个方法是要定义为void类型通过异常来处理删除失败的情况呢,还是定义为Boolean返回值来通过true或 false来返回删除的结果呢,笔者不得而知。为此,笔者捶胸顿足,不得安寝。于是笔者参考了两本猛书《.NET 框架程序设计》和《代码大全》,通过引用这两本书上的一些话来小作分析(书中的原文都用黑体标出)。
首先,我们讨论异常,还是要先知道异常是个什么东东。《.NET 框架程序设计》是这么定义的:“异常是对程序接口隐含假设的一种违反”。
这里面还有两个名词需要解释:”程序接口“和"隐含假设"。程序接口就是类型定义中的字段,属性,方法,事件等,这些成员的定义就是类型的程序接口。我们定义的接口通常会有一些隐含的假设,比方说删除用户的方法应当假设用户是存在的(对参数的假设),数据库连接是可用的(对执行环境的假设)等等。当这些程序接口中出现的假设呗违反时,异常就出现了。也就是说出现这两种情况时,我们应该抛出异常来反应这种违反程序接口假设的方法。
“因此,在设计一个类型是,我们应该首先假设类型最常见的试用方式,然后设计接口能使之能够很好的处理这种情况。最后再考虑接口带来的隐含假设,并且当任何这些假设被违反时便抛出异常。” 因此,异常不必然是错误,也不是什么无法预料的特殊情况,而是对程序接口隐含假设的一种违反。
下面给出一些《代码大全》中关于使用异常的忠告:
1. 只有在真正例外的情况写才抛出异常。换句话说,就是仅在其他编码实践方法无法解决的情况下才使用异常。异常的应用情形跟断言相似,都是来处理那些不仅罕见甚至永远不该发生的情况。
2. 不能用异常来推卸责任。如果某种的错误情况可以在局部处理,那就应该在局部处理掉它。不要把可以在局部处理掉的错误当成一个未被捕获的异常抛出去。
3. 创建一个集中的异常报告机制。有种方法可以确保异常处理的一致性,即创建一个集中的异常报告机制。这个集中的报告机制能够为一些与异常有关的信息提供一个集中的存储,如所发生的异常种类,每个异常该被如何处理及如何格式化异常消息等。
最后,奉上《代码大全》中的一句话,从应用程序的角度来解析错误处理,我看完有点顿悟的感觉。
应对应用程序运行时发生的严重错误的最佳做法,又是就是释放所有已获得的资源并终止程序执行,而让用户去重新输入数据再次运行程序(Stroustrup 1997)。
其实异常只是一种机制,不能因为编程语言中有这种机制而去使用异常,还有好多错误处理机制:在局部处理错误,使用错误代码来传递错误,在日志文件中记录调试信息,关闭系统等,这些方式应该灵活的应用,也许是单独地,也许可以交叉的使用,最终应该以两个标准来确定错误处理方式:用户的体验和设计的鲁棒性。
分享到:
相关推荐
java throw抛出异常实例二 java throw抛出异常实例二
(2)修改UserDaoImp1类,要求用户id不能修改,修改则抛出异常 (3)使用log4j输出日志信息 2.技能训练 (1)会使用try-catch-finally捕获和处理异常 (2)会使用throw和throws (3)会使用log4j记录日志 3.实践 ...
java throw抛出异常实例一 java throw抛出异常实例一
Java 自定义异常和抛出异常的练习demo
第一次发自己写的例子。c#如何处理异常。 其中包括异常格式,抛出异常和自定义异常
21.javathrow抛出异常对象.zip21.javathrow抛出异常对象.zip21.javathrow抛出异常对象.zip21.javathrow抛出异常对象.zip21.javathrow抛出异常对象.zip21.javathrow抛出异常对象.zip21.javathrow抛出异常对象.zip21....
关于在SQL中抛出异常的写法 最有用的地方是在做报表时,经常不知道过程写得对不对,而用查询分析器查,有时页面环境和分析器环境又不一样,这样用他来抛出异常就可以在页面环境下调试了.
22.javathrows声明抛出异常序列.zip22.javathrows声明抛出异常序列.zip22.javathrows声明抛出异常序列.zip22.javathrows声明抛出异常序列.zip22.javathrows声明抛出异常序列.zip22.javathrows声明抛出异常序列.zip22...
01主动抛出异常
抛出异常截图抛出异常截图抛出异常截图
C++通用异常类 可以获得 抛出异常的行数,函数,所在文件 捕获异常的行数,函数,所在文件
一个java抛出异常的小Demo 手动抛出 并处理
C++语言与其他编程语言一样,其中也包含有关于异常的处理。我们在这里将会为大家详细讲解一下有关C++抛出异常的实现方法,及异常的应用方式。希望大家可以从中获得些帮助,以提高对此的理解程度。
mybatis启动无线循环的抛出异常类,只要用这个继承,就可以抛出异常
C++ 异常抛出实例: 用代码详细阐述异常抛出的具体过程。
检测程序是否异常关闭,检测程序是否抛出异常窗口未能继续执行,关闭程序继续执行 需在config中设置程序进程名称,程序路径,异常窗口名称(可用Spy4捕捉一下窗体标题),检测时间,
抛出异常简单代码示例,JAVA运行,希望对大家有所帮助
C++析构函数不能抛出异常的几条原因,里面详细列出
xml抛出空异常,xml经常会抛出空的y异常,所以要打一下包
在android开发过程中,我们经常遇到异常的问题,崩溃抛出异常的时候,是非常令人烦闷的。但是异常有一个好处,使得app能在编译的时候给我们提供一些bug信息,有时可能比较模糊,有时可能很精准,甚至提示报错行。...