Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.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 围绕RuntimeException或Error设计应用程序异常层次结构是否更好?_Java_Exception Handling - Fatal编程技术网

Java 围绕RuntimeException或Error设计应用程序异常层次结构是否更好?

Java 围绕RuntimeException或Error设计应用程序异常层次结构是否更好?,java,exception-handling,Java,Exception Handling,可能重复: 看看我们的应用程序如何处理错误,我们一直在稳步地从检查异常层次结构(例如,异常->ApplicationException->SomethingSpecificBadHappenedException)过渡,因为在许多情况下,我们有许多长的调用链,它们只是跳过ApplicationException,它增加的值很少,但会使API变得混乱(我们越来越同意以下内容中表达的观点: 在围绕未经检查的异常重新设计错误处理时,我们采用了“故障屏障”方法,最初我们开始使用基于RuntimeExc

可能重复:

看看我们的应用程序如何处理错误,我们一直在稳步地从检查异常层次结构(例如,异常->ApplicationException->SomethingSpecificBadHappenedException)过渡,因为在许多情况下,我们有许多长的调用链,它们只是跳过ApplicationException,它增加的值很少,但会使API变得混乱(我们越来越同意以下内容中表达的观点:

在围绕未经检查的异常重新设计错误处理时,我们采用了“故障屏障”方法,最初我们开始使用基于RuntimeException的层次结构,类似于中的示例

我们一直在想,让他们从错误中走出来是否会更清晰,尤其是在这样一个事实周围,它会让我们做一些类似于:

}捕获(异常e){

在我们的应用程序中有许多地方,但有以下区别:

}catch(Throwable t){
}catch(Error Error){


虽然我想不出遵循这一点的API的主要示例,但我想找的示例最好是常见API中的例外/错误层次结构的根目录,或者关于风格或功能差异的注释,这些差异应该决定一个根目录优先于另一个根目录。

规则是,不要创建应用程序例外t是
Error
的后代。
Error
层次结构仅用于JVM和核心库报告的不可恢复错误


据我所知,没有哪个主要的API违反了这一规则。

您想扩展
RuntimeException

但总的来说。。。 听起来真正的问题是,您的组织认为最好到处抛出
ApplicationException
,而不是抛出特定的、有意义的、有文档记录的异常

根据您引用的文献:

意外事故
一种期望条件,要求方法做出替代响应,该响应可以用方法的预期目的来表示。方法的调用方期望这种条件,并有一种应对策略

故障
阻止方法实现其预期目的的一种计划外情况,如果不参考方法的内部实现,就无法描述这种情况

像“一切都未检查”这样的单一方法与“一切都已检查”一样糟糕(在我看来,更糟) 如果该条件是编程错误,则它是一个
运行时异常

如果条件是调用方可能期望并能够处理的有意义的情况,请使用
Exception


如果情况是系统错误(如资源不可用),阻止任何有意义的操作继续进行,请使用
error
(但这是非常罕见的)。

除了其他答案之外:如果不在“normal”中重试,则不应捕获错误或丢弃我能想到的捕获错误子类的主要原因是:您正在使用自己的类加载系统,想要隔离损坏的插件

ThreadDeath的JavaDoc说:

只有在异步终止后必须清理的情况下,应用程序才应捕获此类的实例。如果ThreadDeath被方法捕获,则必须重新捕获它,以便线程实际死亡


澄清一下-抛出的异常是有意义的层次结构的一部分。错误处理代码是倾向于进入长链捕获或抛出父ApplicationException类的代码。同样,这个问题并不提倡“一切都是”任何东西,但是我们的大多数应用程序异常(>90%)似乎不属于“调用者可能期望并能够处理”。有趣的是,对我们来说,资源的不可用性通常是在中设计的,我们正试图以逐渐减少的功能正常运行。我也没有看到任何API,尽管AssertionException似乎打破了这种模式,特别是在倡导者抛出新的AssertionException之后()作为合理的idiom@DavidZaslavsky是的,我在搜索时没有看到,但这个问题是我调查的要点。