Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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_Exception Handling - Fatal编程技术网

Java 处理多个异常的通用/集中方法

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

这是在Java 6上实现的

我可以有一个通用的方法来处理我的异常吗?因此,不要在每个方法中都这样做n次

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子句的部分。