java - 一个真正捕获所有的java异常

标签 java c++

我正在使用一个非常错误的 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/

相关文章:

java - 编写条件语句

java - com.google.auth.oauth2.GoogleCredentials.createScoped 处出现 StackOverflowError(GoogleCredentials.java :222)

java - 转换日期时出现错误的日期

具有简单类定义的 C++ 未解析外部

c++ - boost spirit qi 整数和 float 的数值解析

java - 在网页 (html) 上以表格格式显示数组变量 (Java) 中的值

java - 检测 PDF 中丢失/损坏的 Unicode 映射

c++ - 提升icl interval_map interval_set模板

c++ - 带括号和不带括号实例化的对象到底有什么区别?

c++ - 如何使用 C++ 读取和解析 URL 的 XML 或 JSON 内容?