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

时间:2011-08-02 09:31:00

标签: 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
    } catch (Exception e) {
        handleAll (e);
    }

和方法handleAll(e)

if e.instanceOf(XException)

else if e.instanceOf(YException)

else if e.instanceOf(ZException)

第二种方法有什么问题吗?

更新

我最初的问题是关于“集中处理”在一个地方对于已检查和运行时异常。答案指出我应该避免使用instanceof()。

@ aioobe的想法看起来很整洁。对这种方法有任何负面意见吗?

7 个答案:

答案 0 :(得分:4)

我看到它有一个小问题。由于您确实希望handleAll方法重新抛出任何未捕获的异常,因此必须将其声明为throws Exception。这意味着调用handleAll的方法也是如此。

如果X-Y-ZException都是RuntimeExceptions,我认为这没有错。 (我可能忽略了一些东西,因为这是我第一次看到这种方法。)

为了确保instanceof方法的行为与catch子句完全相同,我会考虑设计handleAll(RuntimeException e)这样的方法:

private void handleAll(RuntimeException e) {
    try {
        throw e;
    } catch (XException xe) {
        ...
    } catch (YException xe) {
        ...
    } catch (ZException xe) {
        ...
    }
}

答案 1 :(得分:2)

这是一种糟糕的方法。它将减少LOC(代码行),但它会产生难以理解,更依赖于资源(它需要更多的内存和处理能力)。它也降低了可读性。

所以第一个是最好的

答案 2 :(得分:1)

你可以这样做,但我不认为它是好的编码风格。将异常处理程序保持在抛出Exceptions的行附近很方便。 假设您的代码发生了变化,并抛出了一个新的异常。然后你必须更新处理它们的方法;所以现在你必须在两个地方做出改变。如果代码不再抛出特定的异常,或者您决定应在更高级别处理某些异常,则会发生同样的情况。

另外,我对“捕获(Exception exc)”持谨慎态度。它太笼统了,尽量让你的Exception处理程序尽可能具体。

答案 3 :(得分:1)

Java 7将使事情变得更好。因为catching multiple exceptions是可能的。

答案 4 :(得分:0)

第二种方法确实有问题:如果被调用的方法签名被修改并抛出一种新的异常,代码仍然可以正常编译,而你没有正确处理这个新的异常。

使用第一种方法,编译器将产生错误,这将强制您处理新的异常。

答案 5 :(得分:0)

第二种方法将捕获所有Exception,包括RunTimeException。确保你正确处理它们。

答案 6 :(得分:0)

我认为每个异常都是唯一的(当代码中的比较位置,而不是抛出异常的时候),因此您不应该将异常处理通知。

你可能希望每次IE都处理异常差别很小。如果某个地方抛出了FileNotFoundException,你可能会创建一个新文件,但其他时间可能会导致应用程序终止的致命异常。