Error Handling
Use Exceptions Rather Than Return Codes
Back in the distant past there were many languages that didn't have exceptions.In those languages the techniques for handling and reportiing errors were limited.You either set an error flag or returned an error code that caller could check.The problem with these approaches is that they clutter the caller.The caller must check for errors immediately after the call.Unfortunately, it's easy to forget.For this reason it is better to throw an exception when you encounter an error.
Write your Try-Catch-Finally Statement First
One of the most insteresting things about exceptions is that they define a scope within your program.When you execute code in the try portion of a try-catch-finally statement,you are stating that execution can abort at any point and then resume at the catch.In a way, try blocks are like transactions.Your catch has to leave your program in a consistent state,no matter what happens in the try.For this reason it is good practice to start with a try-catch-finally statement when you are writting code that could throw exception.This helps you define what the user of that code should expect,no matter what goes wrong with the code that is executed in the try.
Try to write tests that force exceptions,and then add behavior to your handler to satisfy your tests.This will cause you to build the transaction scope of the try block first and will help you maintain the transaction nature of that scope.
Use Unchecked Exceptions
We have to decide-really-whether checked exceptions are worth their price.The price of checked exceptions is an Open/Closed Principle violation.If you throw a checked exception from a method in your code and the catch is three levels above, you must declare that exception in the signature of each method between you and the catch.This means that a change at a low level of the software can force signature changes on many higher levels.The change modules must be rebuilt and redeployed even though nothing they care about change.
Checked exceptions can sometimes be useful if you are writing a critical library: You must catche them.But in general application development the dependency costs outweight the benefits.
Provide Context with Exceptions
Each exception that you throw should provide enough context to determine the source and location of an error.In Java, you can get a stack trace from any exception;however, a stack trace can't tell you the intent of the operation that failed.
Create information error messages and pass them along with your exceptions.Mention the operation that failed and the type of failture.If you are logging in your application, pass along enough information to be able to log the error in your catch.
Define Exception Classes in Terms of a Caller's Needs
There are many ways to classify errors.We can classify them by their source:Did they come from one component or another?Or their type:Are they device failures,network failures, or programming errors?However, when we define exception classes in an application,our most important concern should be how they are caught.
Wrappers can be very useful.In fact, wrapping third-party APIs is a best practice.When you wrap a third-party API,you minimize your dependencies upon it:You can choose to move to a different library in the future without much penalty.Wrapping also makes it easier to mock out third-party calls when you are testing your own code.
One final advantage of wrapping is that you aren't tired to a particular vendor's API design choices.You can define an API that you fell comfortable with.Often a single exception class is fine for a particular area of code.The information sent with the exception can distinguish the errors.Use different classes only if there are times when you want to catch one exception and allow the other one to pass through.
Define the Normal Flow
If you follow the advice in the preceding sections, you'll end up with a good amount of separation between your business logic and your error handling.The bulk of your code will start to look like a clean unadorned algorithm.However,the process of doing this pushes error detection to the edges of your program.You wrap external APIs so that you can throw your own exceptions, and you define a handler above your code so that you can deal with any aborted computation.Most of the time this is a great approach,but there are some times when you may not want to abort.
Sometimes you create a class or configure an object so that it handles a special case for you.When you do, the client code doesn't have to deal with exceptional behavior.That behavior is encapsulated in the special case object.
Don't Return Null
I think that any discussion about error handling should include mention of the things we do that invite errors.The first on the list is returning null.I can't begin to count the number of applications I've seen in which nearly every other line was a check for null.
When we return null, we are essentially creating work for ourselves and foisting problems upon our callers.All it takes is one missing null check to send an application spinning out of control.
Don't Pass Null
Returning null from methods is bad,but passing null into methods is worse.Unless you are working with an API wichi expects you to pass null,you shoud aviod passing null in your code whenever possible.
In most programming languages there is no good way to deal with a null that is passed by a caller accidentally.Because this is the case,the rational approach is to forbid passing null by default.When you do, you can code with the knowledge taht a null in an argument list is an indication of a problem, and end up with far fewer careless mistakes.
Error Handling的更多相关文章
- Erlang error handling
Erlang error handling Contents Preface try-catch Process link Erlang-way error handling OTP supervis ...
- MySQL Error Handling in Stored Procedures 2
Summary: this tutorial shows you how to use MySQL handler to handle exceptions or errors encountered ...
- setjmp()、longjmp() Linux Exception Handling/Error Handling、no-local goto
目录 . 应用场景 . Use Case Code Analysis . 和setjmp.longjmp有关的glibc and eglibc 2.5, 2.7, 2.13 - Buffer Over ...
- Error Handling and Exception
The default error handling in PHP is very simple.An error message with filename, line number and a m ...
- Clean Code–Chapter 7 Error Handling
Error handling is important, but if it obscures logic, it's wrong. Use Exceptions Rather Than Return ...
- [RxJS] Error handling operator: catch
Most of the common RxJS operators are about transformation, combination or filtering, but this lesso ...
- MySQL Error Handling in Stored Procedures---转载
This tutorial shows you how to use MySQL handler to handle exceptions or errors encountered in store ...
- Error Handling in ASP.NET Core
Error Handling in ASP.NET Core 前言 在程序中,经常需要处理比如 404,500 ,502等错误,如果直接返回错误的调用堆栈的具体信息,显然大部分的用户看到是一脸懵逼的 ...
- beam 的异常处理 Error Handling Elements in Apache Beam Pipelines
Error Handling Elements in Apache Beam Pipelines Vallery LanceyFollow Mar 15 I have noticed a defici ...
随机推荐
- SDUTOJ 3312
题目描述 给出一个n*n的矩阵,矩阵中只有0和1,现在有两种操作: 1 x y 将第x行第y列的数字改变(0变1,1变0) 2 x1 y1 x2 y2求由左上角(x1,y1)到右下角(x2,y2)组成 ...
- 怎样使用 GitHub?
作者:珊姗是个小太阳链接:https://www.zhihu.com/question/20070065/answer/79557687来源:知乎著作权归作者所有,转载请联系作者获得授权. 作为一个文 ...
- SQL 向上取整、向下取整、四舍五入取整的实例!round、rounddown、roundup
sql server ==================================================== [四舍五入取整截取] select round(54.56,0) === ...
- CSS3的chapter2
CSS的选择符有很多,大致分为八种: 通配选择符 元素选择符 群组选择符 关系选择符 id及class类选择符 伪类选择符 属性选择符 伪对象选择符 1.通配选择符: 可以使用模糊指定的方式来对对象进 ...
- 运行时c函数
// 修改isa,本质就是改变当前对象的类名 object_setClass(self, [XMGKVONotifying_Person class]); // self动态添加关联 // ...
- monkey中的一些问题
一起来看下导致App Crash的那些原因: 1. 空指针异常:错误日志定位java.lang.NullPointerException,详细日志记录如下 2. 安全异常:错误日志定位 ...
- [Mysql] 一些记录
1> 修改表的字段 alter table trade_market change reqype reqtype int(10) unsigned not null;alter table tr ...
- iOS AFNetworking中cookie的读取与设置
参考: http://blog.csdn.net/zhaoxy_thu/article/details/20532879 实际上AFNetworking中并没有专门针对cookie封装的代码,但是由于 ...
- 1017作业:配置java环境,学习流程图
- redhat网络基础配置
添加浮动IP: ifconfig eth0:1 192.168.1.106 IP配置文件: BOOTPROTO: 采用的启动协议,有三种选择: (1) none:不使用启动协议 (2) static: ...