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的更多相关文章

  1. Erlang error handling

    Erlang error handling Contents Preface try-catch Process link Erlang-way error handling OTP supervis ...

  2. MySQL Error Handling in Stored Procedures 2

    Summary: this tutorial shows you how to use MySQL handler to handle exceptions or errors encountered ...

  3. 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 ...

  4. Error Handling and Exception

    The default error handling in PHP is very simple.An error message with filename, line number and a m ...

  5. Clean Code–Chapter 7 Error Handling

    Error handling is important, but if it obscures logic, it's wrong. Use Exceptions Rather Than Return ...

  6. [RxJS] Error handling operator: catch

    Most of the common RxJS operators are about transformation, combination or filtering, but this lesso ...

  7. MySQL Error Handling in Stored Procedures---转载

    This tutorial shows you how to use MySQL handler to handle exceptions or errors encountered in store ...

  8. Error Handling in ASP.NET Core

    Error Handling in ASP.NET Core 前言  在程序中,经常需要处理比如 404,500 ,502等错误,如果直接返回错误的调用堆栈的具体信息,显然大部分的用户看到是一脸懵逼的 ...

  9. beam 的异常处理 Error Handling Elements in Apache Beam Pipelines

    Error Handling Elements in Apache Beam Pipelines Vallery LanceyFollow Mar 15 I have noticed a defici ...

随机推荐

  1. epoll实现压测工具

    代码: /* * g++ -o stress_test ./stress_test.cpp */ #include <stdlib.h> #include <stdio.h> ...

  2. Android 对电话进行监听和挂断

    1.添加权限 <!--拨打电话的权限--><uses-permission android:name="android.permission.PROCESS_OUTGOIN ...

  3. [问题2014A09] 解答

    [问题2014A09]  解答 通过简单的计算可得 \[(AB)^2=9AB,\cdots\cdots(1)\] 将 (1) 式的右边移到左边, 并将 \(A,B\) 分别提出可得 \[A(BA-9I ...

  4. Sprint(第五天11.18)

  5. XAF应用开发教程-内置Attribute功能列表

    在 XAF 框架,一些用来生成一个业务应用程序的信息是在Attribute中指定.您可以将属性应用到业务类 (或它的成员) 指定验证规则,指定如何对数据进行显示. 设置关系类等.本主题提供了有关在何处 ...

  6. js插入动态脚本

    原文章:https://www.w3cmm.com/dom/insert-javascript.html 动态脚本指的是在页面加载时不存在,但将来的某一时刻通过修改该DOM动态添加的脚本.和操作HTM ...

  7. Deep Learning 9_深度学习UFLDL教程:linear decoder_exercise(斯坦福大学深度学习教程)

    前言 实验内容:Exercise:Learning color features with Sparse Autoencoders.即:利用线性解码器,从100000张8*8的RGB图像块中提取颜色特 ...

  8. springmvc的单文件上传

    @RequestMapping("/up") public ModelAndView up(MultipartFile myfiles , HttpServletRequest r ...

  9. Listview 隐藏item

    隐藏某一项item(防止list改变后导致复用convertview而错乱--如果删掉list中的该项,会导致复用convertview混乱) 方法: convertView.setVisibilit ...

  10. features block

    很轻松就能把一个新建的block导出到一个module包里.