Difference between using Throwable and Exception in a try catch
有时我看到
有时
有什么区别
- 副本:stackoverflow.com/questions/581878/…
- 相关:stackoverflow.com/questions/2129647/…stackoverflow.com/questions/498217/…
通过捕获Throwable,它包括Error子类的内容。通常不应该这样做,除非在一个线程的最高"catch all"级别,在这个级别上您想要记录日志,或者完全处理所有可能出错的事情。在框架类型的应用程序(例如,应用程序服务器或测试框架)中,它更为典型,在这种应用程序中,它可以运行未知代码,并且不应受到该代码出错的任何影响,尽可能多。
- 最好解释一下这里的层次结构。
- 这个答案的上下文:throwable作为子类同时包含错误和异常,所以first try/catch包含第二个,但通常过于广泛。
- 它还包括用户定义的throwable直接子类和throwable本身的实例。没有什么能阻止你写throw new Throwable();,所以这是真正抓住一切的唯一方法。
- @易赛可以在框架的情况下使用它!
第一个捕获Throwable的所有子类(包括Exception和Error),第二个捕获Exception的所有子类。
Error在任何情况下都是以编程方式不可恢复的,通常不会被捕获,除非是出于日志记录的目的(再次通过)。Exception是程序性可恢复的。它的子类RuntimeException表示编程错误,通常也不会被捕获。
- 令人惊讶的是,在这个答案出现4年后,大多数"代码分析"工具仍将报告称,捕获可丢弃的错误是一个严重错误。日志记录是捕获丢弃的一个非常有效的原因。多年来开发的服务器告诉我,1)日志记录将在收到Error和2)除非有日志记录,否则您可能永远不会收到发生OOM的通知,这让您想知道服务器为什么开始表现"滑稽"。
- 究竟什么意思?它是否如此严重,以至于我们不能在调用它之后再调用任何Java方法(日志记录等),而不会有机会从JVM得到不可预测的行为?
- Its subclass RuntimeException indicates a programming error不确定我是否同意这一说法。如果是这样,则意味着应检查所有预期的异常。如果我期望某个东西可能会失败,并且不能被应用程序恢复,但我希望至少抛出一个有意义的异常呢?在这种情况下使用检查过的异常似乎是无用的,并创建样板代码。
Throwable是Exception和Error的超类。在正常情况下,我们应该始终捕获Exception的子类,这样根本原因就不会丢失。
只有在特殊情况下,您可能看到错误的Java控件的错误,您应该捕获EDCOX1 1或EDCOX1 0。
I remember catching Throwable to flag that a native library is not loaded.
Thowable捕捉到了实际上所有的东西,甚至是threaddeath,默认情况下,threaddeath会被抛出,以阻止线程从现在被弃用的Thread.stop()方法中退出。因此,通过捕获Throwable,您可以确保在不经过catch块的情况下永远不会离开try块,但是您应该准备好处理OutOfMemoryError和InternalError或StackOverflowError。
捕获Throwable对于将各种请求委托给外部代码的外部服务器循环最有用,但它本身可能永远不会终止以保持服务的活动性。