391

有时,我看到

try {

} catch(Throwable e) {

}

而有时

try {

} catch(Exception e) {

}

有什么区别?

4

5 回答 5

304

通过捕获Throwable它包含子类的东西Error。您通常不应该这样做,除非在您想要记录或以其他方式绝对处理所有可能出错的线程的最高“catch all”级别。在框架类型应用程序(例如应用程序服务器或测试框架)中更为典型,它可以运行未知代码,并且尽可能不受该代码出错的任何影响。

于 2010-02-16T15:50:45.720 回答
233

第一个捕获所有子类Throwable(这包括ExceptionError),第二个捕获所有子类Exception

Error以任何方式在编程上都无法恢复,并且通常不会被捕获,除非用于记录目的(再次通过它)。Exception可以通过编程方式恢复。它的子类RuntimeException表示一个编程错误,通常也不会被捕获。

于 2010-02-16T15:52:12.587 回答
37

ThrowableException以及的超类Error。在正常情况下,我们应该始终捕获 的子类Exception,这样根本原因就不会丢失。

只有在您发现无法控制 Java 代码的可能出错的特殊情况下,您才应该捕获ErrorThrowable.

我记得捕获 Throwable 以标记未加载本机库。

于 2014-08-05T06:24:52.127 回答
34

Throwable捕获所有东西,甚至是默认抛出的 ThreadDeath 以从现在已弃用的Thread.stop()方法中停止线程。因此,Throwable通过 catch 可以确保您永远不会离开 try 块而不至少通过您的 catch 块,但您应该准备好处理OutOfMemoryErrorand InternalErroror StackOverflowError

捕获Throwable对于将各种请求委托给外部代码但本身可能永远不会终止以保持服务活动的外部服务器循环最有用。

于 2010-02-16T15:56:52.560 回答
2

我见过人们使用 Throwable 来捕捉一些由于基础设施故障/不可用而可能发生的错误。

于 2019-11-07T21:47:51.270 回答