Java异步exception:我能抓住它们吗?

我一直在阅读JLS,我遇到了第11.1.3节。 我引用的异步exception :

大多数exception由于它们发生的线程的动作而同步发生,并且在程序中指定可能导致这种exception的点。 相反,异步exception是可能在程序执行的任何时刻发生的exception。

异步exception仅在以下情况下发生:

[…]

  • Java虚拟机中的内部错误或资源限制,阻止它实现Java编程语言的语义。 在这种情况下,抛出的异步exception是VirtualMachineError的子类的实例。

是否有可能为记录目的或通知捕获此类exception(因为我认为这样的事情是不可恢复的)? 我怎么能实现这样的呢?

您可以像任何其他exception一样捕获此类exception。 唯一的问题是它们可能出现在程序的任何地方,因此很难捕获它们。 你基本上必须在try..catch块中包装所有线程的run方法和main方法,但你不能为你不能控制的线程(比如Swing EDT,或者定时器的线程等)那样做。 )。

通常也不建议捕获Error任何子类,因为JVM可能处于不稳定状态,这可能导致进一步的失败(例如,在OutOfMemoryError的情况下,您甚至可能没有足够的内存来处理exception) 。 但是,日志记录是在我眼中捕获Error的正当理由。

我建议的解决方案是通过将其设置为默认exception处理程序来使用未捕获的exception处理 程序 。 在此处理程序中,如果未在代码中的任何位置捕获它们,您将获得所有exception和错误,并且您可以尝试记录它们。

没有必要捕获这些exception(VirtualMachineError的子类),因为你没有关于pogram在哪种状态下的不确定性,Doc说明虚拟机错误:

当内部错误或资源限制阻止它实现本章中描述的语义时,Java虚拟机实现会抛出一个对象,该对象是VirtualMethodError类的子类的实例。 该规范无法预测可能遇到内部错误或资源限制的位置,并且无法准确地确定何时可以报告它们

因此,假设你遇到OutOfMemoryError或UnknownError,你可以做很多事情,一旦你的vritualmashine无法正常工作,你就无法为用户提供任何帮助,因为你的程序也不能正常工作,除了你不知道在什么时候,点,并说明它发生的原因,因为它不是由您的程序引起的代码错误。