Java异常处理的12条军规总结

  

  

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
  

  

比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException的异常。

  

异常发生的原因有很多,通常包含以下几大类:
  

  

& # 8226;用户输入了非法数据。
  

  

& # 8226;要打开的文件不存在。
  

  

& # 8226;网络通信时连接中断,或者JVM内存溢出。

  

这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。
  

  

在爪哇语言中,异常从使用方式上可以分为两大类:

  
      <李> CheckedException李   <李> UncheckedException李   
  

在Java中类的异常结构图如下:

  

癑ava异常处理的12条军规总结"

  
      <李>可检查异常需要在方法上声明,一般要求调用者必须感知异常可能发生,并且对可能发生的异常进行处理。可以理解成系统正常状态下很可能发生的情况,通常发生在通过网络调用外部系统或者使用文件系统时,在这种情况下,错误是可能恢复的,调用者可以根据异常做出必要的处理,例如重试或者资源清理等。   <李>非检查异常是不需要在扔子句中声明的异常.JVM根本不会强制您处理它们,因为它们主要是由于程序错误而在运行时生成的。它们扩展了RuntimeException。最常见的例子是NullPointerException可能不应该重试未经检查的异常,并且正确的操作通常应该是什么都不做,并让它从您的方法和执行堆栈中出来。在高执行级别,应记录此类异常。   <李>错误是最为严重的运行时错误,几乎是不可能恢复和处理,一些示例是OutOfMemoryError, LinkageError和StackOverflowError。它们通常会使程序或程序的一部分崩溃。只有良好的日志记录练习才能帮助您确定错误的确切原因。   
  

  

1永远不要抓中吞掉异常,否则在系统发生错误时,你永远不知道到底发生了什么

        抓住(SomeException e) {   返回null;   }      

2尽量使用特定的异常而不是一律使用例外这样太泛泛的异常

        公共空间foo()抛出异常{//错误的做法}            公共空间foo()抛出MyBusinessException1 MyBusinessException2{//正确的做法}      

,,,,,,,一味的使用例外,这样就违背了可检查异常的设计初衷,因为调用都不知道异常到底是什么,也不知道该如何处理。捕获异常时,也不要捕获范围太大,例如捕获例外,相反,只捕获你能处理的异常,应该处理的异常。即然方法的声明者在方法上声明了不同类型的可检查异常,他是希望调用者区别对待不同异常的。

  

3从未抓住Throwable类

  

,,,永远不要捕获Throwable,因为错误也是继承自它,错误是Jvm都处理不了的错误,你能处理?所以基于有些Jvm在错误时就不会让你捕捉住。

  

4正确的封装和传递异常

  

不要丢失异常栈,因为异常栈对于定位原始错误很关键

        抓住(SomeException e) {   把新的MyServiceException(“一些信息:”+ e.getMessage ());//错误的做法   }      

一定要保留原始的异常:

        抓住(SomeException e) {   把新MyServiceException(“一些信息:“e);//正确的打开方式   }      

5要打印异常,就不要抛出,不要两者都做

        抓住(SomeException e) {   记录器。错误(“信息”,e);   把e;   }      

这样的日志没有任何意义,只会打印出一连串的错误日志,对于定位问题无济于事。

  

6不要在最后块中抛出异常

  

如果在最后中抛出异常,将会覆盖原始的异常,如果最后中真的可能会发生异常,那一定要处理并记录它,不要向上抛。

  

7不要使用printStackTrace

  

要给异常添加上有用的上下文信息,单纯的异常栈,没有太大意义

  

8把早赶晚

  

异常界著名的原则,错误发生时及早抛出,然后在获得所以全部信息时再捕获处理,也可以理解为在低层次抛出的异常,在足够高的抽象层面才能更好的理解异常,然后捕获处理。

Java异常处理的12条军规总结