To zależy od definicji "bezpieczne". Wyjątek da mylący ślad stosu, którego nie nazwałbym "bezpiecznym".Rozważmy:
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
}
}
który ma z tego wyjścia:
$ 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)
Zauważ, że metoda t1
jest całkowicie brakuje śladu stosu w pierwszym przypadku testowego. W ogóle nie ma przydatnych informacji kontekstowych.
Teraz może używać fillInStackTrace
wypełnienie tej informacji tuż przed rzutem:
this.e.fillInStackTrace();
throw this.e;
... ale to właśnie czyni pracę dla siebie (praca, którą będzie zapomnieć czasami). Po prostu nie ma w tym żadnej korzyści. I nie wszystkie wyjątki pozwalają to zrobić (niektóre wyjątki powodują, że ślad stosu jest tylko do odczytu).
Mówiłeś gdzie indziej w komentarzach, że jest to, aby uniknąć „powielania kodu.” Jesteś znacznie lepiej pełniąca funkcję wyjątkiem producentów:
private IllegalStateException buildISE() {
return new IllegalStateException("le sophisticated way");
}
(Może być static final
jeśli lubisz).
A potem rzuca go tak:
throw buildISE();
który unika duplikacja kodu bez wprowadzających w błąd śladów stosu i niepotrzebnych wystąpień wyjątków.
Oto, co wygląda na to, że stosuje się do powyższego:
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)
Myślę, że jest zbędny. chyba że kodowanie wyrzuca to bardzo często – PermGenError
Zawsze ma wystąpienie wyjątku, nawet twój kod nie zgłasza wyjątku – nav0611