2015-03-25 4 views
6

Biorąc pod uwagę ten StackTrace:Czy istnieje lepszy sposób na wychwycenie tylko określonych przyczyn wyjątku?

java.lang.RuntimeException: 
... 
Caused by: com.mypackage.SpecificException 

i to try-catch:

try { 
    ts.init(); 
} catch (RuntimeException e) { 
    if (e.getCause() instanceof SpecificException) { 
     //do something 
    } else { 
     throw e; 
    } 
} 

nie można zmodyfikować kod SpecificException ani metody, która otacza ten wyjątek w RuntimeException.

Czy istnieje lepszy sposób na złapanie tylko SpecificException?

+0

możliwy duplikat [Java: przechwytywanie określonych wyjątków] (http://stackoverflow.com/questions/4566450/java-catching-specific-exceptions) – Sim

+1

@Sim nie jest duplikatem, ponieważ OP chce/musi obsługiwać przyczynę "RuntimeException", jeśli taki istnieje. –

+0

Co jest nie tak z rozwiązaniem, które sugerujesz? – assylias

Odpowiedz

5

Jedynym mechanizmem Javy jest wybór wyjątków do złapania, które są klasami wyjątków. Jeśli chcesz rozróżnić między wyjątkami tej samej klasy w oparciu o ich przyczyny, musisz wyłapać wszystkie wyjątki tej klasy, jak wykazałeś.

Należy jednak zauważyć, że problematyczne jest ponowne zgłoszenie wyjątku po jego przechwyceniu, ponieważ zastępuje on oryginalny ślad stosu w nowym, specyficznym dla kontekstu nowego throw. To może znacznie utrudnić debugowanie. Aby tego uniknąć, należy zawinąć wychwycony wyjątek jako przyczynę oddzielnego, nowego wyjątku i wyrzucić go.

+0

Zwróć uwagę, że jeśli istnieje szansa, że ​​będziesz miał wiele warstw (przechwytywanie, zawijanie, rzutowanie), może być konieczne sprawdzenie więcej niż przyczyny złapanego wyjątku: może być również potrzebne sprawdź przyczynę przyczyny i przyczynę * tego * wyjątku, itd .. –

+0

+1. Z drugiej strony, OP, napotykasz to, ponieważ * biblioteka, której nie kontrolujesz, rzuca wyjątki, które przeciekają do rozmówców twojego komponentu *. Zawijanie wyjątków biblioteki nie zawsze jest konieczne lub użyteczne, ale może zapewnić większą kontrolę i dokumentację w stosunku do wyjątków wychodzących z Twojego kodu. (Jest to szczególnie ważne w projektowaniu interfejsu API.) –