有时候我会看到
try {
} catch(Throwable e) {
}
有时
try {
} catch(Exception e) {
}
有什么区别
答案 0 :(得分:204)
通过捕获Throwable
,它包含了子类Error
的内容。您通常不应该这样做,除非您想要记录或以其他方式处理可能出错的所有内容的线程的最高“catch all”级别。在框架类型应用程序(例如应用程序服务器或测试框架)中更常见的是,它可以运行未知代码,不应受任何的影响,因为该代码出错了,如尽可能多。
答案 1 :(得分:146)
第一个捕获Throwable
的所有子类(包括Exception
和Error
),第二个捕获Exception
的所有子类。
Error
在程序上是不可恢复的,通常不会被捕获,除了记录目的(再次传递)。 Exception
可以通过编程方式恢复。它的子类RuntimeException
表示编程错误,通常也不会被捕获。
答案 2 :(得分:18)
Throwable
是Exception
以及Error
的超类。在正常情况下,我们应该始终捕获Exception
的子类,以便根本原因不会丢失。
只有在您看到可能出现问题而且无法控制Java代码的特殊情况下,您应该抓住Error
或Throwable
。
我记得抓住Throwable来标记未加载本机库。
答案 3 :(得分:14)
Thowable
甚至捕获了所有内容,即使是默认情况下抛出的ThreadDeath也会停止现在已弃用的Thread.stop()
方法的线程。因此,通过捕获Throwable
,您可以确保在不至少通过catch块的情况下永远不会离开try块,但是您应该准备好处理OutOfMemoryError
和InternalError
或者StackOverflowError
。
捕获Throwable
对于外部服务器循环最有用,它将各种请求委托给外部代码,但本身可能永远不会终止以使服务保持活动状态。
答案 4 :(得分:0)
我已经看到人们使用Throwable捕获由于基础架构故障/不可用而可能发生的一些错误。