在try catch中使用Throwable和Exception的区别

有时候,我看到

try {


} catch(Throwable e) {


}

有时

try {


} catch(Exception e) {


}

有什么不同?

260825 次浏览

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

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

Error在编程上以任何方式都是不可恢复的,通常不会被捕获,除了日志目的(再次传递它)。Exception是可编程恢复的。它的子类RuntimeException表示一个编程错误,通常也不会被捕获。

Throwable实际上捕获了所有东西,甚至包括默认情况下抛出的ThreadDeath,以停止现在已弃用的Thread.stop()方法的线程。因此,通过捕获Throwable,你可以确保在不至少执行catch块的情况下永远不会离开try块,但你也应该准备好处理OutOfMemoryErrorInternalErrorStackOverflowError

捕获Throwable对于外部服务器循环最有用,这些外部服务器循环将所有类型的请求委托给外部代码,但本身可能永远不会终止以保持服务处于活动状态。

ThrowableExceptionError的超类。在正常情况下,我们应该总是捕获Exception的子类,这样根本原因就不会丢失。

只有在你看到不受Java代码控制的出错可能性的特殊情况下,你才应该捕获ErrorThrowable

我记得捕捉Throwable来标记本机库未加载。

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

我觉得这个应该放在这里

Java Exception Hierarchy Image

(__abc0)

来源:https://www.tutorialspoint.com/java/java_exceptions.htm