在Java中的Rethrow异常

Min*_*ang 10 java exception-handling exception

关于在Java中重新抛出异常,我有一个非常简单的问题.

这是代码片段:

public static void main(String[] args) throws FileNotFoundException {
    try {
        FileReader reader = new FileReader("java.pdf");
    } catch (FileNotFoundException ex) {
        throw ex;
    }
}

public static void main(String[] args) throws FileNotFoundException {        
        FileReader reader = new FileReader("java.pdf");        
}
Run Code Online (Sandbox Code Playgroud)

为什么我们需要重新抛出ex第一个版本,而第二个版本看起来更优雅?什么可能是好处,哪个版本比另一个更受欢迎?

Ale*_*exR 15

你是对的.第二个版本更好.而且第一个版本没有任何意义.除了异常的堆栈跟踪将是"错误的"之外,它也是如此.

"重新抛出"异常有以下原因:

  1. 如果你以前有事情要做.
  2. 如果捕获一种类型的异常并抛出其他类型的异常:

例:

try {
   // do something
} catch (IOException ioe) {
    throw new IllegalStateException(ioe);
}
Run Code Online (Sandbox Code Playgroud)

  • @AlexR同意第一种方式看起来很奇怪.尽管如此,堆栈跟踪不会是"错误的".堆栈跟踪在构造异常时填充,而不是在抛出异常时填充.这可以在`java.lang.Throwable`的源代码中看到 (8认同)

pb2*_*b2q 9

在给出的例子中,重新投掷Exception服务没有任何意义.

如果捕获然后重新抛出异常的方法需要在看到它时采取一些额外的操作,并且还希望将它传播给调用者,那么这样做可能很有用,这样调用者就可以看到并执行某些操作.ExceptionExceptionException

  • @sleske:我不同意。`finally` 总是被执行。因此,以 @smcg 记录异常的示例为例:我只希望在“catch”中记录该日志条目,而不是在“Exception”未发生时记录该日志条目。如果它在“finally”中,即使没有抛出“Exception”,我也总是会得到日志条目 (2认同)

smc*_*mcg 8

如果我想在catch块中执行其他操作,我只会捕获/重新抛出异常(而不是仅仅抛出它) - 例如,在重新抛出之前编写一个日志语句.