Java 处理多个异常的通用/集中方法
这是在Java 6上实现的 我可以有一个通用的方法来处理我的异常吗?因此,不要在每个方法中都这样做n次Java 处理多个异常的通用/集中方法,java,exception-handling,Java,Exception Handling,这是在Java 6上实现的 我可以有一个通用的方法来处理我的异常吗?因此,不要在每个方法中都这样做n次 try { // Do something } catch (XException e) { // Do something } catch (YException e) { // Do something } catch (ZException e) { // Do something } 我有 try { // Do something
try {
// Do something
} catch (XException e) {
// Do something
} catch (YException e) {
// Do something
} catch (ZException e) {
// Do something
}
我有
try {
// Do something
} catch (Exception e) {
handleAll (e);
}
方法handleAll(e)
if e.instanceOf(XException)
else if e.instanceOf(YException)
else if e.instanceOf(ZException)
第二种方法有什么问题吗
更新:
我最初的问题是关于将检查异常和运行时异常的“集中处理”放在一个地方。答案指出我应该避免instanceof()
@艾奥贝的想法在我看来很好。对这种方法有什么负面意见吗?这是一种不好的方法。它将减少LOC(代码行),但会造成难以理解、更依赖资源(需要更多内存和处理能力)。它还降低了可读性
因此,第一种是最好的您可以这样做,但我认为它不是一种好的编码风格。让异常处理程序靠近抛出异常的行是很方便的。 假设您的代码发生更改,并引发新的异常。然后你必须更新处理它们的方法;因此,现在你必须在两个地方进行更改。如果代码不再抛出特定的异常,或者您决定在更高级别处理某些异常,也会发生同样的情况
此外,我对“catch(Exception exc)”也持谨慎态度。它太笼统了,请尽量使您的异常处理程序具体化。在我看来,有一个小问题。由于您确实希望
handleAll
方法重新抛出任何未捕获的异常,因此必须声明抛出异常。这意味着调用handleAll
的方法也是如此
如果X-
,Y-
和zeexception
都是运行时异常
,我看不出有什么问题。(不过我可能忽略了一些东西,因为这是我第一次看到这种方法。)
<> >确保<<代码>实例> 方法完全符合catch子句,我会考虑这样设计<代码> HealLeLoad(RunTimeExpEt E)< /C> >:
private void handleAll(RuntimeException e) {
try {
throw e;
} catch (XException xe) {
...
} catch (YException xe) {
...
} catch (ZException xe) {
...
}
}
第二种方法确实有问题:如果被调用的方法签名被修改并抛出一种新的异常,代码仍然可以正常编译,而您没有正确处理这个新的异常
使用第一种方法,编译器将产生一个错误,这将迫使您处理新的异常 第二种方法将捕获所有异常
s,包括运行时异常
s。确保正确处理它们。我认为每个异常都是唯一的(在代码中进行比较时,而不是抛出异常时),因此不应将异常处理泛化
您可能希望每次处理异常时差别不大,例如,如果抛出了某个where FileNotFoundException,您可能会创建一个新文件,但另一次可能是导致应用程序终止的致命异常。Java 7将使情况变得更好。因为这是可能的。对于不属于这三类之一的异常,您将如何处理?虽然所有的异常处理都是这样做的,但这样做是不好的做法。你可以在jdk中摆脱这个问题7@Jon:这3个仅为示例,以一个块结束Exception@shinynewbike:那块砖能做什么?这就是问题所在——要么它必须抛出异常,在这种情况下,您调用的方法也必须声明抛出异常,要么它必须吞下异常,或者将其包装在RuntimeException中。另一方面,第一种方法违反了DRY原则。老实说,我不认为handleAll
方法会降低可读性那么多…所有涉及instanceof的内容都是99%的错误做法。instanceof可以通过我建议的公式避免。我不确定我是否明白你的意思。你说的是检查过的异常吗?是的。catch(Exception)将捕获新的异常类型,并将其传递给handleAll,在那里它将作为未知异常处理。这将在运行时发现,而不是在编译时发现。对。如果X-、Y-和ZException都是RuntimeException,并且handleAll会重新调用任何未捕获的异常,那么您认为这种方法可以吗?无论如何,RuntimeException应该很少被捕获,所以我不确定这个问题是否有意义。如果必须经常捕获运行时异常,可能应该检查这些异常。我仍然更喜欢标准(或新的多捕获)块。实际上,这些是Checked和runtimes的混合。然后我怀疑您需要在原始方法上抛出异常,或者在调用handleAll时抛出另一个try/catch块(或者,最糟糕的是,在handleAll方法中抑制未捕获的异常)。在这两种情况下,它开始变得混乱,我会强烈考虑复制catch子句的部分。