【发布时间】:2011-01-17 11:05:28
【问题描述】:
有时候,我明白
try {
} catch(Throwable e) {
}
有时
try {
} catch(Exception e) {
}
有什么区别?
【问题讨论】:
有时候,我明白
try {
} catch(Throwable e) {
}
有时
try {
} catch(Exception e) {
}
有什么区别?
【问题讨论】:
通过捕获Throwable,它包含了Error 的子类。您通常不应该这样做,除非在您想要记录或以其他方式绝对处理所有可能出错的线程的最高“catch all”级别。它在框架类型应用程序(例如应用程序服务器或测试框架)中更为典型,它可以运行未知代码并且不应该受到该代码出错的任何的影响,因为尽可能的。
【讨论】:
throw new Throwable();,所以这是真正抓住一切的唯一方法。
【讨论】:
Error 和 2) 除非有日志记录,否则您可能永远不会收到发生 OOM 的通知,这让您想知道为什么服务器开始表现得“有趣”
programmatically unrecoverable 到底是什么意思?它是否如此严重,以至于我们在捕获它(日志记录等)之后基本上不能调用任何 Java 方法,而没有机会从 JVM 获得不可预测的行为?
Its subclass RuntimeException indicates a programming error:不确定我是否同意这个说法。如果这是真的,这意味着所有预期的异常都应该是检查异常。如果我预计某些事情可能会失败并且我的应用程序无法恢复,但我希望至少抛出一个有意义的异常怎么办?在这种情况下使用检查异常似乎没用,并且会创建样板代码。
Throwable 捕捉到了所有东西,甚至是默认抛出的 ThreadDeath 以从现在已弃用的 Thread.stop() 方法中停止线程。因此,通过捕获 Throwable,您可以确保您永远不会离开 try 块而至少要通过您的 catch 块,但您应该准备好同时处理 OutOfMemoryError 和 InternalError 或 StackOverflowError。
捕获Throwable 对于将各种请求委托给外部代码但本身可能永远不会终止以保持服务活动的外部服务器循环最有用。
【讨论】:
Throwable 是Exception 和Error 的超类。在正常情况下,我们应该始终捕获Exception 的子类,这样根本原因就不会丢失。
只有在您发现可能出错且无法控制您的 Java 代码的特殊情况下,您才应该捕获 Error 或 Throwable。
我记得捕获 Throwable 以标记未加载本机库。
【讨论】:
我看到人们使用 Throwable 来捕获一些由于基础设施故障/不可用而可能发生的错误。
【讨论】: