一个java异常,真正捕获所有

A java exception that really does catch all

本文关键字:java 异常 一个      更新时间:2023-10-16

我正在使用一个非常错误的JNI,它抛出了我需要以某种方式捕获的各种异常。(其中一些与c++引用强制转换异常一样低级!)

我想知道的是接受的(即。标准)捕获所有的习惯用法是在Java中;类似于c++中的catch (...)

到现在为止我一直在使用

} catch (java.lang.Exception e){
    ...
}

,因为我认为这是标准的。但我已经意识到,至少在理论上是可能的,从java.lang.Throwable派生一个类并抛出它,在这种情况下,我应该真正使用

} catch (java.lang.Throwable e){
    ...
}

只是我以前没有在源代码中看到过,所以也许它是特殊的。你们会怎么做?

您可以捕获Throwable来捕获Java中可以捕获的所有内容,但请注意,这样做很少是一个好主意—您实际上可能会干扰JVM的正常操作。Error层次结构是Throwable派生的层次结构的另一部分,用于真正严重的错误,例如堆栈溢出、内存不足或.class文件损坏。接住它们而不适当地穿上它们是一个非常非常糟糕的主意。

另一个问题是它是不够的。如果您在本机代码中有低级编程错误,即在JNI屏障的另一端,您的程序状态很可能损坏到无法恢复,JVM甚至可能无法正确地注意到这一点并抛出异常——它可能损坏到无法传播异常。

如果JNI桥接之外的代码有问题,您唯一真正的选择是修复该代码。如果这不是一个选择(例如,因为你不能访问源代码),你必须完全沙箱代码。编写一个本机进程,使用本机代码,并且可以以某种方式与之通信(标准输入/标准输出、联网等),然后从Java程序启动该进程。如果进程死了,那它就死了,但至少它不会拖走你的程序。

使用catch(Throwable e) {.. }是可行的方法。这就是我在使用JNI的一个应用程序中所做的。

只是catch Throwable,因为这会捕获所有内容。

请记住Java有两种基本的异常类型:

  • 异常,被检查
  • RuntimeException不是

你可以自定义异常并使用该异常抛出异常Throwable是所有异常的父类

这取决于您是只想捕获Exception,还是同时捕获ExceptionError(通过使用Throwable)。

正如Error javadoc中所说的那样,您可能不想捕获这些东西-但是如果您知道要如何处理捕获的Error s,那么您的情况似乎可以保证它。

在我的主代码中,我通常总是使用catch Throwable来确保我可以获得所有错误条件并适当地报告它

Throwable是Exception的超类型。

Exception可以捕获所有检查过的异常