2012-11-14 6 views
18

Mam oświadczenie, które zawiera wiele sprawdzonych wyjątków. Mogę dodać wszystkie bloki catch dla nich wszystkich tak:Czy można przechwycić wszystkie wyjątki z wyjątkiem wyjątków czasu wykonywania?

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(IOException ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} catch(ClassCastException ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} catch... 

nie podoba mi się to, bo wszystkie są obsługiwane w ten sam sposób, więc nie jest rodzajem kodu powielania i jest tam również dużo kodu napisać. Zamiast mogła złapać Exception:

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(Exception ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} 

to byłoby ok, z wyjątkiem chcę wszystkie wyjątki środowiska wykonawczego do wyrzucenia bez przyłapania. Czy jest jakieś rozwiązanie tego problemu? Myślałem, że jakaś sprytna generyczna deklaracja typu wyjątku, który ma zostać złapany, może załatwić sprawę (a może nie).

Odpowiedz

40

Można wykonać następujące czynności:

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(RuntimeException ex) { 
    throw ex; 
} catch(Exception ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} 
+2

Dobra odpowiedź ... +1 – Juvanis

+2

+1 Fajna. Nie najczystsze, jakie kiedykolwiek widziałem, ale działa. – drasto

11

Jeśli można użyć Java 7, można użyć Multi-Catch:

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(IOException|ClassCastException|... ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} 
+0

+1 ostrzegając mnie o tej nowej, cennej (i już dawno spóźnionej) funkcji w Javie 7 –

+0

+1 Z tego powodu użyłbym Java 7, gdybym mógł. Ale nie mogę i jest mi bardzo przykro, ponieważ ten Multi-Catch jest doskonały. Muszę użyć Java 6: ((( – drasto

1

Można spróbować coś takiego, na zasadzie złapać wszystkich, a następnie ponownie rzuć RuntimeException, jeśli jest instancją tej klasy ...

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(Exception ex) { 
    if (ex instanceof RuntimeException){ 
     throw ex; 
    } 
    else { 
     throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
    } 
} 

Widząc jak chociaż byłoby to niechlujny pisać w kółko (i złe dla konserwacji), prawdopodobnie przenieść kod do innej klasy, coś takiego ...

public class CheckException { 
    public static void check(Exception ex, String message) throws Exception{ 
     if (ex instanceof RuntimeException){ 
      throw ex; 
     } 
     else { 
      throw new MyCustomInitializationException(message, ex); 
     } 
    } 
} 

i używać go w Twój kod tak ...

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(Exception ex) { 
    CheckException.check(ex,"Class Resolver could not be initialized."); 
} 

Stwierdzając, że mijamy w message tak, że wciąż możemy dostosować naszą MyCustomInitializationException.

+0

Ostatnia opcja byłaby dobra, gdybym potrzebowała zrobić to kilka razy, ale to nie jest moja sprawa - potrzebuję tylko użyć jej raz.) Tylko sparametryzowałem statyczną metodę za pomocą 'String "wiadomość: – drasto

+0

musisz rzucić' ex' na 'RuntimeException' w kodzie. –

Powiązane problemy