有时,我看到
try {
} catch(Throwable e) {
}
而有时
try {
} catch(Exception e) {
}
有什么区别?
通过捕获Throwable
它包含子类的东西Error
。您通常不应该这样做,除非在您想要记录或以其他方式绝对处理所有可能出错的线程的最高“catch all”级别。在框架类型应用程序(例如应用程序服务器或测试框架)中更为典型,它可以运行未知代码,并且尽可能不受该代码出错的任何影响。
Throwable
是Exception
以及的超类Error
。在正常情况下,我们应该始终捕获 的子类Exception
,这样根本原因就不会丢失。
只有在您发现无法控制 Java 代码的可能出错的特殊情况下,您才应该捕获Error
或Throwable
.
我记得捕获 Throwable 以标记未加载本机库。
Throwable
捕获所有东西,甚至是默认抛出的 ThreadDeath 以从现在已弃用的Thread.stop()
方法中停止线程。因此,Throwable
通过 catch 可以确保您永远不会离开 try 块而不至少通过您的 catch 块,但您应该准备好处理OutOfMemoryError
and InternalError
or StackOverflowError
。
捕获Throwable
对于将各种请求委托给外部代码但本身可能永远不会终止以保持服务活动的外部服务器循环最有用。
我见过人们使用 Throwable 来捕捉一些由于基础设施故障/不可用而可能发生的错误。