一个真正包罗万象的java异常
我正在与一个非常错误的JNI一起工作,它抛出了我需要以某种方式捕获的各种异常。(其中有些与C++引用异常一样低) 我想知道的是Java中公认的(即标准的)捕获一切的习惯用法是什么;类似于C++中的代码> catch(…)<代码>。p> 到目前为止,我一直在使用一个真正包罗万象的java异常,java,c++,Java,C++,我正在与一个非常错误的JNI一起工作,它抛出了我需要以某种方式捕获的各种异常。(其中有些与C++引用异常一样低) 我想知道的是Java中公认的(即标准的)捕获一切的习惯用法是什么;类似于C++中的代码> catch(…)。p> 到目前为止,我一直在使用 } catch (java.lang.Exception e){ ... } 因为我认为这是标准的。但我已经意识到,至少从理论上讲,从java.lang.Throwable派生一个类并抛出它是可能的,在这种情况下,我应该真正使用 } c
} catch (java.lang.Exception e){
...
}
因为我认为这是标准的。但我已经意识到,至少从理论上讲,从java.lang.Throwable派生一个类并抛出它是可能的,在这种情况下,我应该真正使用
} catch (java.lang.Throwable e){
...
}
只是我以前没有在源代码中看到过,所以它可能很特殊。你们会这样做吗?使用
catch(Throwable e){..}
是一种方法。这就是我在使用JNI的一个应用程序中所做的 只要抓住可丢弃的,因为这会抓住一切
请记住,Java有两种基本的异常类型:
- 异常,已选中
- 运行时异常,它不是
异常
,还是同时捕获异常
和错误
(通过使用Throwable
)
正如在中所说,您可能不想捕获这些东西,但是如果您知道如何处理捕获的
错误s,那么您的情况可能会再次证明这一点。您可以捕获丢弃的来捕获Java中可以捕获的所有内容,但是请注意,这样做很少是一个好主意——实际上,您可能会干扰JVM的正常操作。Error
层次结构是从Throwable
派生的层次结构的另一部分,用于真正关键的错误,如堆栈溢出、内存不足或.class文件损坏。抓住它们而不适当地扔它们是一个非常非常糟糕的主意
另一个问题是它不够。如果您在本机代码中有低级编程错误,即在JNI屏障的远端,那么您的程序状态很可能会在恢复之后被破坏,JVM甚至可能无法正确地注意到这一点并抛出异常—它可能会在传播异常的能力之外被破坏
如果JNI桥之外的代码有错误,那么您唯一的实际选择就是修复该代码。如果这不是一个选项(例如,因为您没有访问源代码的权限),那么您必须对代码进行完全沙箱处理。编写一个本机进程,该进程使用本机代码,并且可以通过某种方式进行通信(stdin/stdout、网络等等),然后从Java程序启动该进程。如果进程死掉,它也会死掉,但至少它不能用它关闭你的程序。在我的主代码中,我通常使用一个catch Throwable
,以确保我可以得到所有错误条件并适当地报告它。Throwable是一种超级类型的异常
异常可以捕获所有选中的异常由于异常是从JNIGreat answer抛出的,因此在这里创建自定义异常没有帮助;并解释了为什么我在专业代码中没有看到catch java.lang.Throwable。