我试图捕获一个特定的异常并处理它,然后抛出一个执行代码来处理任何异常的泛型异常。这是如何完成的?此代码段不会捕获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");
}
}
}
答案 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();