//How an exception can be lost.
class VeryImportantException extends Exception {
private static final long serialVersionUID = 1L;
public String toString() {
return "A very important exception!";
}
}
class HoHumException extends Exception {
private static final long serialVersionUID = 1L;
public String toString() {
return "A trivial exception";
}
}
public class LostMessage {
void f() throws VeryImportantException {
throw new VeryImportantException();
}
void dispose() throws HoHumException {
throw new HoHumException();
}
public static void main(String[] args) {
try {
LostMessage lm = new LostMessage();
try {
lm.f();
} finally {
lm.dispose();
}
} catch (Exception e) {
System.out.println(e);
}
}
} /* Output:
A trivial exception
*///:~
上述代码运行后可以发现VeryImportantException被第二个异常覆盖掉了,这是一个致命的缺陷:关键信息丢失了
除了上面这种还有另一个更简单的隐藏异常的方法:finally中return
public class ExceptionSilencer {
public static void main(String[] args) {
try {
throw new RuntimeException();
} finally {
// Using ‘return’ inside the finally block
// will silence any thrown exception.
return;
}
}
} ///:~