Tùy thuộc vào định nghĩa của bạn về "an toàn". Ngoại lệ sẽ cung cấp cho một dấu vết ngăn xếp gây hiểu lầm, mà tôi sẽ không gọi là "an toàn".Xem xét:
public class ThrowTest {
private static Exception e = new Exception("t1"); // Line 2
public static final void main(String[] args) {
ThrowTest tt;
tt = new ThrowTest();
try {
tt.t1();
}
catch (Exception ex) {
System.out.println("t1:");
ex.printStackTrace(System.out);
}
try {
tt.t2(); // Line 16
}
catch (Exception ex) {
System.out.println("t2:");
ex.printStackTrace(System.out);
}
}
private void t1()
throws Exception {
throw this.e;
}
private void t2()
throws Exception {
throw new Exception("t2"); // Line 31
}
}
Đó có sản lượng này:
$ java ThrowTest
t1:
java.lang.Exception: t1
at ThrowTest.<clinit>(ThrowTest.java:2)
t2:
java.lang.Exception: t2
at ThrowTest.t2(ThrowTest.java:31)
at ThrowTest.main(ThrowTest.java:16)
Lưu ý cách phương pháp t1
là hoàn toàn mất tích từ stack trace trong trường hợp thử nghiệm đầu tiên. Không có thông tin ngữ cảnh hữu ích nào cả.
Bây giờ, bạn có thể sử dụng fillInStackTrace
để điền vào thông tin mà ngay trước khi ném:
this.e.fillInStackTrace();
throw this.e;
... nhưng đó chỉ là làm việc cho chính mình (công việc bạn sẽ quên đôi khi). Đơn giản là không có lợi ích gì cả. Và không phải tất cả ngoại lệ đều cho phép bạn làm điều đó (một số trường hợp ngoại lệ làm cho dấu vết ngăn xếp chỉ đọc).
Bạn đã nói ở nơi khác trong nhận xét rằng điều này là để tránh "sao chép mã". Bạn đang nhiều khấm khá hơn có một chức năng xây dựng ngoại lệ:
private IllegalStateException buildISE() {
return new IllegalStateException("le sophisticated way");
}
(Có thể static final
nếu bạn muốn.)
Và sau đó ném nó như thế này:
throw buildISE();
mà tránh sao chép mã mà không có dấu vết ngăn xếp gây hiểu lầm và các trường hợp ngoại lệ không cần thiết.
Đây là những gì trông giống như áp dụng các phần trên:
public class ThrowTest {
public static final void main(String[] args) {
ThrowTest tt;
tt = new ThrowTest();
try {
tt.t1(); // Line 8
}
catch (Exception ex) {
System.out.println("t1:");
ex.printStackTrace(System.out);
}
try {
tt.t2(); // Line 15
}
catch (Exception ex) {
System.out.println("t2:");
ex.printStackTrace(System.out);
}
}
private static final Exception buildEx() {
return new Exception("t1"); // Line 24
}
private void t1()
throws Exception {
throw buildEx(); // Line 29
}
private void t2()
throws Exception {
throw new Exception("t2"); // Line 34
}
}
$ java ThrowTest
t1:
java.lang.Exception: t1
at ThrowTest.buildEx(ThrowTest.java:24)
at ThrowTest.t1(ThrowTest.java:29)
at ThrowTest.main(ThrowTest.java:8)
t2:
java.lang.Exception: t2
at ThrowTest.t2(ThrowTest.java:34)
at ThrowTest.main(ThrowTest.java:15)
Tôi nghĩ nó dư thừa. trừ khi bạn mã ném nó rất thường xuyên – PermGenError
Nó luôn luôn có một trường hợp ngoại lệ, ngay cả mã của bạn không ném một ngoại lệ – nav0611