在Java中,当你须要统一处理异常的时候,你是会选择catch (Exception),仍是直接catch (Throwable)?java
#Java的异常体系spring
#应该catch什么 其实只要是Throwable和其子类都是能够throw和catch的,那么若是在须要统一处理异常的地方,咱们应该catch (Throwable th) 仍是 catch (Exception)呢?json
这两种处理的区别在于,catch throwable会把Error和其余继承Throwable的类捕捉到。而catch Exception只会捕捉Exception极其子类,捕捉的范围更小。先不考虑有其余的类继承了Throwable的状况下(附录A),第一种catch至关于比第二种catch多捕捉了把Error和其子类。服务器
那么究竟Error是否须要捕捉呢?JDK中Error类的的注释(以下)里提到过,Error是一种严重的问题,应用程序不该该捕捉它。网络
An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions. The ThreadDeath error, though a "normal" condition, is also a subclass of Error because most applications should not try to catch it.app
A method is not required to declare in its throws clause any subclasses of Error that might be thrown during the execution of the method but not caught, since these errors are abnormal conditions that should never occur.框架
Java Lanuage Spec 7 中也提到:Error继承自Throwable而不是继承自Exception,是为了方便程序可使用 "catch (Exception)"来捕捉异常而不会把Error也捕捉在内,由于Exception发生后能够进行一些恢复工做的,可是Error发生后通常是不可恢复的。ui
The class Error is a separate subclass ofThrowable, distinct from Exception in the class hierarchy, to allow programs to use the idiom "} catch (Exception e) { " (§11.2.3) to catch all exceptions from which recovery may be possible without catching errors from which recovery is typically not possible.线程
已经不难看出,Java自己设计思路就是但愿你们catch Exception就足够了,若是有Error发生,catch了也不会有什么做用(附录B)。设计
#引伸,如何设计异常体系? 如何设计异常体系要根据你的项目的状况,类库框架,应用程序的异常设计方式都会有一些区别。下面简单谈谈我的对异常设计的一些见解
##类库/框架
##应用程序
#附录A:是否应该直接继承Throwable来扩展新的异常? 我的认为异常都应该继承自Exception或者RuntimeException,并且Java自己对Exception和Error的规划就很清晰了,Java本身类库中没有异常是直接继承自Throwable的。
#附录B:Error能够catch吗? 能够catch了后作些其余处理吗? Error是能够catch的,并且也能够向常规Exception同样被处理,并且就算不捕捉的话也只是致使当前线程挂掉,其余线程仍是能够正常运行,若是有须要的话捕捉Error以后也能够作些其余处理。可是Error是一种系统内部的错误,这种错误不像Exception同样是多是程序和业务上的错误是能够恢复的。
假设进行网络链接操做的时候,IOException 发生了,多是网络中断,我能够再尝试几回。
假设OutOfMemoryError发生了,就算被捕捉了,能够有什么手段让程序正常运行下去吗? 假设ExceptionInInitializerError发生了,类没法被正常初始化,这个是能够经过捕捉来恢复的吗?