Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一个真正包罗万象的java异常_Java_C++ - Fatal编程技术网

一个真正包罗万象的java异常

一个真正包罗万象的java异常,java,c++,Java,C++,我正在与一个非常错误的JNI一起工作,它抛出了我需要以某种方式捕获的各种异常。(其中有些与C++引用异常一样低) 我想知道的是Java中公认的(即标准的)捕获一切的习惯用法是什么;类似于C++中的代码> catch(…)。p> 到目前为止,我一直在使用 } catch (java.lang.Exception e){ ... } 因为我认为这是标准的。但我已经意识到,至少从理论上讲,从java.lang.Throwable派生一个类并抛出它是可能的,在这种情况下,我应该真正使用 } c

我正在与一个非常错误的JNI一起工作,它抛出了我需要以某种方式捕获的各种异常。(其中有些与C++引用异常一样低) 我想知道的是Java中公认的(即标准的)捕获一切的习惯用法是什么;类似于C++中的代码> catch(…)<代码>。p> 到目前为止,我一直在使用

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

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

只是我以前没有在源代码中看到过,所以它可能很特殊。你们会这样做吗?

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

只要抓住可丢弃的,因为这会抓住一切

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

  • 异常,已选中
  • 运行时异常,它不是

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

这取决于您是只捕获
异常
,还是同时捕获
异常
错误
(通过使用
Throwable


正如在中所说,您可能不想捕获这些东西,但是如果您知道如何处理捕获的
错误
s,那么您的情况可能会再次证明这一点。

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

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


如果JNI桥之外的代码有错误,那么您唯一的实际选择就是修复该代码。如果这不是一个选项(例如,因为您没有访问源代码的权限),那么您必须对代码进行完全沙箱处理。编写一个本机进程,该进程使用本机代码,并且可以通过某种方式进行通信(stdin/stdout、网络等等),然后从Java程序启动该进程。如果进程死掉,它也会死掉,但至少它不能用它关闭你的程序。

在我的主代码中,我通常使用一个
catch Throwable
,以确保我可以得到所有错误条件并适当地报告它。

Throwable是一种超级类型的异常


异常可以捕获所有选中的异常

由于异常是从JNIGreat answer抛出的,因此在这里创建自定义异常没有帮助;并解释了为什么我在专业代码中没有看到catch java.lang.Throwable。