我正在使用一个非常错误的JNI,它会抛出我需要以某种方式捕获的各种异常。 (其中一些与C ++参考强制转换异常一样低级!)
我想知道的是,所有被捕获的(即标准)习惯是用Java写的;类似于C ++中的catch (...)
。
到目前为止,我一直在使用
} catch (java.lang.Exception e){
...
}
因为我认为这是标准的。但我已经意识到,理论上至少可以从java.lang.Throwable派生一个类并抛出它,在这种情况下我应该使用
} catch (java.lang.Throwable e){
...
}
只有我之前没有在源代码中看到它,也许它是特殊的。你们会这样做吗?
答案 0 :(得分:3)
你可以捕获Throwable
来捕获Java中可以捕获的所有内容,但请注意,这样做很少是个好主意 - 实际上你可能会干扰JVM的正常运行。 Error
层次结构是派生自Throwable
的层次结构的另一部分,用于实际的关键错误,例如堆栈溢出,内存不足或损坏的.class文件。抓住它们而不是正确地扔它们是一个非常非常糟糕的主意。
另一个问题是它不够。如果您在本机代码中存在低级编程错误,即在JNI屏障的远端,您的程序状态可能会在恢复之外被破坏,并且JVM甚至可能无法正确注意到这一点并抛出异常 - 除了传播异常的能力之外,它可能已被破坏。
如果JNI网桥之外的代码有问题,那么唯一真正的选择是修复该代码。如果这不是一个选项(例如,因为您无法访问源代码),则必须完全沙箱化代码。编写一个使用本机代码的本机进程,您可以以某种方式(stdin / stdout,网络,无论如何)进行通信,然后从Java程序启动该进程。如果这个过程死了,它就会死掉,但至少它不能用它取下你的程序。
答案 1 :(得分:0)
使用catch(Throwable e) {.. }
是可行的方法。这就是我在我的一个使用JNI的应用程序中所做的。
答案 2 :(得分:0)
抓住Throwable,因为这会抓住一切。
请记住,Java有两种基本的异常类型:
答案 3 :(得分:0)
你可以创建自己的自定义异常并使用该异常抛出异常Throwable是所有异常的父类
答案 4 :(得分:0)
这取决于您是想仅抓住Exception
,还是抓住Exception
和Error
(通过使用Throwable
)。
正如在Error
javadoc中所说的那样,你可能不想捕捉到这样的事情 - 但是如果你知道你将如何处理被抓住的事情,你的情况似乎也值得保证{{1} }}第
答案 5 :(得分:0)
在我的主要代码中,我通常总是使用catch Throwable
来确保我能够获得所有错误条件并正确报告。
答案 6 :(得分:0)
Throwable是Exception的超级类型。
异常可以捕获所有已检查的异常