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

时间:2013-06-13 11:00:19

标签: java c++

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

我想知道的是,所有被捕获的(标准)习惯是用Java写的;类似于C ++中的catch (...)

到目前为止,我一直在使用

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

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

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

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

7 个答案:

答案 0 :(得分:3)

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

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

如果JNI网桥之外的代码有问题,那么唯一真正的选择是修复该代码。如果这不是一个选项(例如,因为您无法访问源代码),则必须完全沙箱化代码。编写一个使用本机代码的本机进程,您可以以某种方式(stdin / stdout,网络,无论如何)进行通信,然后从Java程序启动该进程。如果这个过程死了,它就会死掉,但至少它不能用它取下你的程序。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

抓住Throwable,因为这会抓住一切。

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

  • 异常,已检查
  • RuntimeException不是

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这取决于您是想仅抓住Exception,还是抓住ExceptionError(通过使用Throwable)。

正如在Error javadoc中所说的那样,你可能不想捕捉到这样的事情 - 但是如果你知道你将如何处理被抓住的事情,你的情况似乎也值得保证{{1} }}第

答案 5 :(得分:0)

在我的主要代码中,我通常总是使用catch Throwable来确保我能够获得所有错误条件并正确报告。

答案 6 :(得分:0)

Throwable是Exception的超级类型。

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