Yis*_*hai 227

通过捕获Throwable它包括子类的东西Error.您通常不应该这样做,除非您想要记录或以其他方式处理可能出错的所有内容的线程的最高"catch all"级别.在框架类型应用程序(例如应用程序服务器或测试框架)中更常见的是,它可以运行未知代码,并且不应该尽可能地受到该代码出错的任何问题的影响.

  • 可能最好在这里解释一下层次结构. (25认同)
  • 这个答案的上下文:Throwable包括Error和Exception作为子类,所以首先try/catch包含第二个但通常过宽. (8认同)
  • 尽管已被接受,但这并没有回答问题,因为大多数答案描述了捕获 Exception 和 Throwable 的最佳实践,而问题是关于差异(例如当我确实想要其中一个时何时使用哪个)。“它包括错误子类的内容”是指定的唯一区别,它实际上是一个全面的答案:什么是错误?为什么它包含它很重要?还有其他差异或最佳实践吗? (5认同)
  • 它还包括Throwable的用户定义的直接子类和Throwable本身的实例.没有什么可以阻止你写'throw new Throwable();`,所以它是真正捕捉一切的唯一方法. (2认同)

Bal*_*usC 164

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

Error以编程方式无法恢复,并且通常不会被捕获,除了日志记录目的(再次通过它).Exception以编程方式可恢复.它的子类RuntimeException表示编程错误,通常也不会被捕获.

  • 相当令人惊讶的是,在这个答案发布4年后,大多数"代码分析"工具仍然会报告抓住throwable作为*critical*错误.记录是捕获Throwable的一个非常有效的原因.多年的开发服务器告诉我1)记录会发生,尽管得到一个'错误'和2)除非有记录,你可能永远不会收到OOM发生的通知,让你想知道为什么服务器开始表现"有趣" (32认同)
  • “程序上无法恢复”到底是什么意思?它是如此严重,以至于我们无法再捕获(记录等)该Java方法后再调用它,而没有机会从JVM中获得不可预测的行为吗? (2认同)

Tam*_*han 44

我觉得这应该在这里:

Java异常层次结构图

图片的替代链接

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

  • **一张图片胜过千言万语**。我认为这应该是公认的答案。 (9认同)

rai*_*mar 20

Throwable是超级的Exception,也是Error.在正常情况下,我们应该始终捕获子类Exception,以便根本原因不会丢失.

只有在您看到可能出现问题而且无法控制Java代码的特殊情况下,您应该抓住Error或者Throwable.

我记得捕获Throwable标记未加载本机库.


x4u*_*x4u 18

Thowable捕获真正的一切甚至ThreadDeath,默认情况下抛出它来停止现在已弃用的Thread.stop()方法的线程.因此,通过捕获Throwable你可以确定你永远不会离开try块而不至少通过你的catch块,但你应该准备也处理OutOfMemoryErrorInternalErrorStackOverflowError.

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