我正在使用一个非常错误的 JNI,它会抛出我需要以某种方式捕获的各种异常。 (其中一些与 C++ 引用转换异常一样低级!)
我想知道的是 Java 中公认的(即 标准)捕获所有的习语是什么;类似于 C++ 中的 catch (...)
。
到目前为止我一直在使用
} catch (java.lang.Exception e){
...
}
因为我认为这是标准的。但我已经意识到,至少在理论上可以从 java.lang.Throwable 派生一个类并将其抛出,在这种情况下我应该真正使用
} catch (java.lang.Throwable e){
...
}
只是我以前没有在源代码中看到过,所以它可能是特殊的。你们会做吗?
最佳答案
您可以捕获 Throwable
以完全捕获 Java 中可以捕获的所有内容,但请注意,这样做很少是一个好主意——您实际上可能会干扰 JVM 的正常运行。 Error
层次结构是从 Throwable
派生的层次结构的另一部分,用于真正严重的错误,例如堆栈溢出、内存不足或损坏的 .class 文件.捕获它们而不正确地扔掉它们是一个非常非常糟糕的主意。
另一个问题是不够。如果您在 native 代码中存在低级编程错误,即在 JNI 屏障的远端,您的程序状态很可能已损坏且无法恢复,并且 JVM 甚至可能无法正确注意到这一点并抛出异常 -它可能已损坏,超出了传播异常的能力。
如果 JNI 桥之外的代码有问题,您唯一的选择就是修复该代码。如果那不是一个选项(例如,因为您无权访问源代码),则必须将代码完全沙盒化。编写一个使用 native 代码的 native 进程,您可以通过某种方式(标准输入/标准输出、网络等)进行通信,然后从您的 Java 程序启动该进程。如果进程死了,它就死了,但至少它不能用它来取消你的程序。
关于java - 一个真正捕获所有的java异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17085396/