代码整洁之道-第7章 错误处理
2016-11-13 12:34
239 查看
《代码整洁之道》第7章-错误处理
错误处理只不过是编程时必须要做的事之一。输入可能出现异常,设备可能失效。简言之,可能会出现错误,当错误发生时,程序员就有责任确保代码照常工作。
编写既整洁又强固的代码—雅致的处理错误代码的技巧和思路。
设置一个错误标识;
返回给调用者检查的错误码;
有异常处理机制后:(遇到错误时,最好抛出一个异常。调用代码很整洁,绮逻辑不会被错误处理搞乱。)
使用异常机制来处理错误。
使用可控异常的代价是:违反“开放/闭合原则”。如果你在方法中抛出可控异常,而catch语句在三个层级一上,你就得在catch语句和抛出异常处之间的每个方法签名中声明该异常。
所以,尽量使用 不可控异常。
Java中,可以从任何异常那里得到“堆栈踪迹(stack trace)”;
应创建信息充分的错误消息(包括失败的操作和失败类型),并和异常一起传递出去。(如果有日志系统,可以传递足够的信息给catch块,并记录下来。)
如果你想要捕获某个异常,并且放过其他异常,就使用不同的异常类。
打包第三方API:
当你打包第三方API,就降低了对它的依赖:未来你可以不太痛苦的改用其他代码库。在你测试自己的代码时,打包也有助于模拟第三方调用。
打包的好处还在于,你不必绑死在某个特定厂商的API设计上。你可以定义自己感觉舒服的API。
曾经见过很多几乎每行代码都在检查null值。
返回null值,基本上是在给自己增加工作量,也是在给调用者添乱。只要有一处没检查null值,应用程序就会失控。(在运行时得到一个NullPointerException异常)。
特例对象是良药。与其返回null值,不如返回一个特例对象—空列表(Collections.emptyList())。
判断是否为null;
使用断言assert;
看上去很美,单仍未解决问题。如果传入null值,还是会得到运行时错误。
在大多数编程语言中,没有良好的方法能对付由调用者意外传入的null值。恰当的做法是,禁止传入null值。
错误处理只不过是编程时必须要做的事之一。输入可能出现异常,设备可能失效。简言之,可能会出现错误,当错误发生时,程序员就有责任确保代码照常工作。
编写既整洁又强固的代码—雅致的处理错误代码的技巧和思路。
7.1 使用异常而非返回码
以前,没有异常处理机制时:(这类手段的问题在于,他们搞乱了调用者代码。调用者必须在调用之后即刻检查错误,不幸的是,这个步骤很容易被遗忘。)设置一个错误标识;
返回给调用者检查的错误码;
有异常处理机制后:(遇到错误时,最好抛出一个异常。调用代码很整洁,绮逻辑不会被错误处理搞乱。)
使用异常机制来处理错误。
7.2 先写Try-Catch-Finally语句
它们在程序中定义了一个范围。执行try-catch-finally语句中try部分的代码时,表明可以随时取消执行,并在catch语句中接续。7.3 使用不可控异常
C#, C++, Ruby, Pyth 都不支持 可控异常,Java支持。使用可控异常的代价是:违反“开放/闭合原则”。如果你在方法中抛出可控异常,而catch语句在三个层级一上,你就得在catch语句和抛出异常处之间的每个方法签名中声明该异常。
所以,尽量使用 不可控异常。
7.4 给出异常发生的环境说明
抛出的每个异常,都应该提供足够的环境说明,以便判断错误的来源和处所。Java中,可以从任何异常那里得到“堆栈踪迹(stack trace)”;
应创建信息充分的错误消息(包括失败的操作和失败类型),并和异常一起传递出去。(如果有日志系统,可以传递足够的信息给catch块,并记录下来。)
7.5 依调用者需要定义异常类
对于代码的某个特定区域,单一异常类通常可行。伴随异常发送出来的信息能够区分不同错误。如果你想要捕获某个异常,并且放过其他异常,就使用不同的异常类。
打包第三方API:
当你打包第三方API,就降低了对它的依赖:未来你可以不太痛苦的改用其他代码库。在你测试自己的代码时,打包也有助于模拟第三方调用。
打包的好处还在于,你不必绑死在某个特定厂商的API设计上。你可以定义自己感觉舒服的API。
7.7 别返回null值
错误处理中,容易引发错误的做法,第一个就是返回null值。曾经见过很多几乎每行代码都在检查null值。
返回null值,基本上是在给自己增加工作量,也是在给调用者添乱。只要有一处没检查null值,应用程序就会失控。(在运行时得到一个NullPointerException异常)。
特例对象是良药。与其返回null值,不如返回一个特例对象—空列表(Collections.emptyList())。
7.8 别传递null值
在方法中返回null值是糟糕的做法,但将null值传递给其他方法就更 糟糕了。判断是否为null;
使用断言assert;
看上去很美,单仍未解决问题。如果传入null值,还是会得到运行时错误。
在大多数编程语言中,没有良好的方法能对付由调用者意外传入的null值。恰当的做法是,禁止传入null值。
相关文章推荐
- 代码整洁之道-----错误处理
- 代码整洁之道精华——第七章 错误处理
- 阅读代码整洁之道->错误处理
- 代码整洁_错误处理
- 整洁代码----设计好错误处理
- 7、代码整洁之道——错误处理(异常处理)
- 代码整洁之道 错误处理 单元测试
- 代码整洁之道--错误处理
- MySql错误处理(四)- 错误代码和消息
- windows下的错误代码处理
- Flex全局错误处理Global Error Handler代码兼容运行于低版本Flash Player
- 当您通过使用 InfoPath 2010 表单连接到 Web 服务时沙盒中处理的代码包含的、 不返回的数据或您收到一条错误消息
- 代码实现AJAX异步回传(弹出javascript脚本)、异步更新的错误处理
- VS2010中错误处理:LC.exe已退出,代码为-1错误
- Flex全局错误处理Global Error Handler代码兼容运行于低版本Flash Player
- “OCIEnvNlsCreate 失败,返回代码为 -1,但错误消息文本不可用”的处理方法收藏
- silverlight 应用程序中未处理的错误代码:2104 类别:InitializeError 消息:无法下载 iis上部署Silverlight
- 软件开发者面试百问-----怎么样让我们的代码可以处理各种错误事件?
- 错误代码8004E00F-COM+无法与Microsoft分布式事物协调程序交谈 的处理