有时候,我会看到
try {
} catch(Throwable e) {
}
有时候
try {
} catch(Exception e) {
}
有什么区别?
有时候,我会看到
try {
} catch(Throwable e) {
}
有时候
try {
} catch(Exception e) {
}
有什么区别?
通过捕获Throwable
,它包括子类Error
。你一般不应该这样做,除非在线程的最高“捕捉所有”级别处,你想记录或以其他方式处理可能出现的所有问题。这在框架类型的应用程序(例如应用服务器或测试框架)中更为典型,它可能正在运行未知代码,并且不应受到该代码出现的任何问题的影响,尽可能地保持稳定。
throw new Throwable();
,因此这是唯一真正捕获所有异常情况的方式。 - AntimonyError
,也会进行日志记录;2)除非进行日志记录,否则可能永远不会收到关于 OOM 的通知,这会让你想知道为什么服务器开始表现得“奇怪”。 - Bruno GriederThrowable
是 Exception
和 Error
的超类。通常情况下,我们应该捕获Exception
子类的异常,这样就不会丢失根本原因。
只有在特殊情况下,假如您发现Java代码无法控制可能出现的错误时,才应该捕获Error
或Throwable
异常。
我记得捕获
Throwable
来标记一个本地库未加载。
Throwable
可以捕获几乎所有异常,包括默认情况下从现在已弃用的Thread.stop()
方法抛出以停止线程的ThreadDeath
。因此,通过捕获Throwable
,您可以确保至少会经过catch块而不会离开try块,但您应该准备处理OutOfMemoryError
、InternalError
或StackOverflowError
。
捕获Throwable
对于委托各种请求到外部代码但可能永远不会终止以保持服务活动的外部服务器循环非常有用。
我见过人们使用Throwable来捕获由于基础设施故障/不可用可能发生的一些错误。