一个java异常,真正捕获所有
A java exception that really does catch all
我正在使用一个非常错误的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
,还是同时捕获Exception
和Error
(通过使用Throwable
)。
正如Error
javadoc中所说的那样,您可能不想捕获这些东西-但是如果您知道要如何处理捕获的Error
s,那么您的情况似乎可以保证它。
在我的主代码中,我通常总是使用catch Throwable
来确保我可以获得所有错误条件并适当地报告它
Throwable是Exception的超类型。
Exception可以捕获所有检查过的异常
- 尝试在 QT 项目中调用 Java 代码时未找到类异常
- JNI GetMethodID 调用,带有挂起的异常 java.lang.ClassNotFoundException
- 与Java的InputMismatchException和IOException Handling等效的C++异常处理机制是什么
- 为什么 ArrayIndexOutOfBound 异常可以在 Java 中捕获,但C++程序反而崩溃
- 线程中的异常 "main" java.lang.UnsatisfiedLinkError: no JNTIest in java.library.path
- 使用 JNI 从 cpp 调用 java 方法时出现异常
- 如何在 Java 中加载 cpp 库时避免异常
- 与 Java 异常相比没有优势
- JNI : 线程"AWT-EventQueue-0" java.lang.UnsatisfiedLinkError 中的异常
- Java:调用本机方法,给出"线程"main"java.lang.UnsatisfiedLinkError中的异常"
- 如何使用 JNI 时获取 C++ 中 Java 异常的描述
- 线程"main" java.lang.UnsatisfiedLinkError 中的异常
- C++/Java JNI收到异常unsastifiedLinkError
- 使用JNA从java中的源对象(.so)文件内部调用C++函数时发生链接异常
- 一个java异常,真正捕获所有
- SWIG生成的java代码不能在64位Solaris上处理异常
- 为什么Java必须抛出并发修改异常?
- 使用SWIG对java进行类型映射异常,仍然没有被捕获
- Java和JNI (dll)之间的索引超出边界异常
- c++和Java异常处理的区别