重新抛出catch子句中的异常后会发生什么?

时间:2012-11-05 06:54:55

标签: java exception exception-handling

在这里,我已经在API和其他相关问题中看到了这一点:

try {

} catch (IOException e) {
    throw new SampleException("Other IOException", e);
}

调用新例外。

但是现在我已经看到了这个自称的例子。我正在尝试编写文档,似乎它再次调用自己。

try {
    statements;
}catch(TheException e) {
    //perform operations before exits;
    throw e; 
}
  

重新抛出异常,以便其他处理程序有机会   处理异常

我想我们TheException例外之后我们再添加一个catch了!那么在这种情况下谁是另一个处理程序?我测试了它,我发现即使编译了catch子句之后的代码!

3 个答案:

答案 0 :(得分:2)

尝试修改JAVA中的异常工作方式,尤其是throw/throws个关键字,以及它们之间的区别。

这是一个很好的page,可以解释这一点。

您可以随时参考documentation了解更多信息。

参考您的问题,您的代码可能无法编译,因为throw所在的方法可能不会throws TheException。您可以在方法标题中添加throws TheException以使其生效,也可以尝试将try/catch封装在处理(捕获)try/catch的其他TheException中。

答案 1 :(得分:2)

  

那么在这种情况下谁是另一个处理程序?

这几乎就好像catch子句从未出现过 - 稍微补充一点以后 catch子句将不会被使用。例如:

try {
    methodWhichCanThrowIOException();
} catch (IOException e) {
    throw e;
} catch (Exception e) {
    // This won't be hit for IOException
}

所以:

  • 如果有另一个围绕此代码的try / catch语句,那么catch 那里可能会捕获异常
  • 否则,假设它是一个已检查的异常,该方法必须声明它可以抛出异常(或超类)并且异常将以正常方式传播出该方法

有关所有详细信息,请参阅JLS的section 11.3section 14.20

答案 2 :(得分:1)

假设您有两种方法。

第一个:

public void methodA() throws IOException {

    try {

        // methodWhichCanThrowIOException();

    } catch (IOException e) {

        // //perform operations before exits;
        throw e;
    }
}

第二个:

public void methodB() {

    try {

        methodA();

    } catch (IOException e) {

        // //perform operations;
    }
}

查看方法B如何调用方法A.最初在方法A中引发的异常是方法A本身的处理程序,但是一旦完成,方法A就决定抛出异常,以便其他处理程序有机会处理异常。其他方法作为方法A.注意方法A可以在不同的层中,在不同的层中。

对于方法A,抛出异常是告知方法B事情发生的好方法。