在catch块中抛出异常

时间:2016-10-14 17:53:13

标签: java

我试图捕获一个特定的异常并处理它,然后抛出一个执行代码来处理任何异常的泛型异常。这是如何完成的?此代码段不会捕获Exception,因此输出为

Exception in thread "main" java.lang.Exception
    at Main.main(Main.java:10)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
IOException specific handling

Process finished with exit code 1

摘录:

import java.io.IOException;

public class Main {

    public static void main(String[] args) throws Exception {
      try {
        throw new IOException();
      } catch (IOException re) {
        System.out.println("IOException specific handling");
        throw new Exception();
      } catch (Exception e) {
        System.out.println("Generic handling for IOException and all other exceptions");
      }
    }
}

1 个答案:

答案 0 :(得分:1)

您在IOException的catch-block中抛出的异常永远不会被捕获。这就是为什么你必须在主方法中添加“抛出异常”的原因。

在同一次尝试之后,多个catch-block的行为类似于if..else级联,以便查找适合处理特定异常的catch-block。

将整个try..catch嵌入另一个try..catch块中:

try {
  try {
    throw new IOException();
  } catch (IOException re) {
    System.out.println("IOException specific handling");
    throw new Exception();
  }
} catch (Exception e) {
    System.out.println("Generic handling for IOException and all other xceptions");
  }

通常会将原始异常嵌入到新的通用异常中,以便在最终异常处理时不会丢失信息(例如,如果要记录堆栈跟踪以确定异常发生的位置):

    throw new Exception(re);

并在最后的catch-block中:

    e.printStackTrace();