Java 异步异常:我可以捕获它们吗?

问题描述 投票:0回答:2

我一直在阅读 JLS,并且遇到了11.1.3 部分。异步异常,我引用:

大多数异常是由于操作者的操作而同步发生的 它们发生的线程,以及程序中的某个点 指定可能导致此类异常。一个异步的 相比之下,异常是可能发生在 程序执行中的任何点。

还有

异步异常仅因以下原因发生:

[...]

  • Java 虚拟机中的内部错误或资源限制,导致其无法实现 Java 编程语言。在这种情况下,异步异常 抛出的是 VirtualMachineError 子类的实例。

是否可以捕获此类异常以用于日志记录或通知(因为我相信此类事情是不可恢复的)?我怎样才能实现这样的目标?

java exception virtual-machine
2个回答
20
投票

您可以像捕获任何其他异常一样捕获此类异常。唯一的问题是它们可能出现在程序中的“任何”位置,因此可靠地捕获它们很困难。基本上,您必须将所有线程的 run 方法和

main
块中的
try..catch
方法包装起来,但是对于您无法控制的线程(例如 Swing EDT 或用于定时器等)。
另外,通常不建议捕获 

Error

的任何子类,因为 JVM 可能处于不稳定状态,这可能会导致进一步的失败(例如,在

OutOfMemoryError
的情况下,您甚至可能没有足够的内存来处理进行异常处理)。然而,日志记录是让我眼中出现
Error
的正当理由。
我建议的解决方案是通过

将其设置为默认异常处理程序

来使用未捕获的异常处理程序。在此处理程序中,如果代码中没有捕获到所有异常和错误,您将获得所有异常和错误,并且您可以尝试记录它们。


3
投票

Java 虚拟机实现抛出一个对象,该对象是 VirtualMethodError 类的子类实例 内部错误或资源限制阻止其实施 本章描述的语义。
本规格不能 预测可能出现内部错误或资源限制的位置 遇到过,并且没有明确规定何时可以报告

因此,假设您遇到 OutOfMemoryError 或 UnknownError,您对此无能为力,一旦您的 vritualmashine 无法正常工作,您就无法为用户提供任何帮助,因为您的程序也无法正常工作,而且您不知道什么时候、点以及发生这种情况的原因,因为它不是由您的程序引起的代码错误。

© www.soinside.com 2019 - 2024. All rights reserved.