前言
本文只写给自己看。
1.什么是异常
异常表示没有遵守契约。
2.异常的信息
在出现了异常情况,为了监控优化程序,统计异常信息,我们可能会将异常信息记录到数据库,为了调试程序,定位错误,我们可能会将程打印到输出日志,即使
你非常肯定捕获到的异常不会以任何方式对程序造成影响,我们也应该用log日志输出警告信息,以便日后更新和维护。也就是说只要出现了异常,我们都会输出异常信息。
2.1异常信息要回答三个问题
1.在哪里出错了
哪个类,哪个方法,哪句代码2.为什么出错
SQL语法错误,还是参数不合法,3.出错的细节信息
例如SQL错误,至少要在错误信息里提供出错的SQL,SQL的参数,如果是业务异常,至少要包含这个业务对象的必要信息2.2什么时候要输出异常信息
一般都是通过异常转移,形成异常链在高层输出2.3避免多次输出同一个异常信息,不要在底层输出信息之后,在上一层还是输出信息
3.什么时候该处理异常
只处理自己有能力处理的异常,即没法处理的异常不要捕获,抛到上层再处理。
4.抛出什么样的异常
CheckException是标准5.异常处理的建议
异常处理的”复用“。用最少的代码集中处理问题。
代码整洁之道
1.使用异常而非返回码2.先写try_catch_finally语句
3.使用不可控异常
4.给出异常发生的环境说明
5.一调用者需要定义异常类
6.定义常规流程
7.别返回null值
8.别传递null值
跟Effective Java里说的跟状态相关的方法,往往应该有个状态测试。
使用特例对象
重构改善既有代码的设计
1以异常取代错误码2.以测试取代异常
Effective Java
57:只针对异常的情况才使用异常58:对可恢复的情况使用受检异常,对编程错误使用运行时异常
59:避免不必要地使用受检的异常
60:优先使用标准异常的异常
避免设计过多自定义异常
61: 抛出域抽象相对应的异常
高层实现应该捕获底层的异常,同事抛出可以按照高层抽象进行解释的异常。也就是异常转移。
特殊的异常转移叫做异常链。
61:每个方法抛出的异常都要有文档
62:在细节消息中包含可能捕获失败的信息
63:努力使失败保持原子性
注意:要考虑异常安全问题,异常安全是指,一个对象碰到异常之后,还能够保证自身的正确性。还有一种更严格的异常安全,叫做“强异常安全”。强异常安全不仅要求出现异常后对象要保证正确性,还要求对象不能作出任何改变,也就是实现“事务”的那种 commit-rollback 机制:要么成功,要么不改变。
64:不要忽略异常