1

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

我想知道的是Java中公认的(标准)习语是什么;类似于catch (...)C++。

到目前为止我一直在使用

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

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

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

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

4

7 回答 7

3

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

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

如果 JNI 桥之外的代码出现故障,您唯一真正的选择是修复该代码。如果这不是一个选项(例如,因为您无权访问源代码),则必须将代码完全沙箱化。编写一个使用本机代码并且您可以通过某种方式进行通信的本机进程(stdin/stdout、网络等),然后从您的 Java 程序启动该进程。如果进程死了,它就死了,但至少它不能用它来关闭你的程序。

于 2013-06-13T11:08:07.013 回答
0

使用catch(Throwable e) {.. }是要走的路。这就是我在一个使用 JNI 的应用程序中所做的。

于 2013-06-13T11:03:45.883 回答
0

只需捕获 Throwable,因为它会捕获所有内容。

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

  • 异常,已检查
  • RuntimeException 不是
于 2013-06-13T11:03:53.053 回答
0

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

于 2013-06-13T11:05:07.000 回答
0

这取决于您是想只捕获Exception,还是两者都捕获Exceptionand Error(通过使用Throwable)。

正如它在Errorjavadoc中所说的那样,您可能不想捕获这些东西-但是如果您知道要如何处理被捕获Error的s,那么您的情况似乎又一次证明了这一点。

于 2013-06-13T11:07:40.460 回答
0

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

于 2013-06-13T11:12:23.973 回答
0

Throwable 是 Exception 的超级类型。

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

于 2013-06-13T11:12:37.747 回答