Java перехватывает несколько исключений, повторно выдает исключение
В Java 7 блок catch был улучшен для обработки нескольких исключений в одном блоке catch. Если вы перехватываете несколько исключений и они имеют схожий код, использование этой функции уменьшит дублирование кода. Давайте разберемся с функцией перехвата множественных исключений в Java на примере.
Java ловит несколько исключений
catch (IOException ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
catch (SQLException ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
}
В Java 7 мы можем поймать оба этих исключения в одном блоке catch следующим образом:
catch(IOException | SQLException ex){
logger.error(ex);
throw new MyException(ex.getMessage());
}
Если блок catch обрабатывает несколько исключений, вы можете разделить их с помощью вертикальной черты (|), и в этом случае параметр исключения (ex) является окончательным, поэтому вы не можете его изменить. Байт-код, сгенерированный этой функцией, меньше и уменьшает избыточность кода.
Исключение повторного вызова Java
Еще одно улучшение сделано в анализе компилятором повторно созданных исключений. Исключение повторного генерирования Java позволяет указать более конкретные типы исключений в предложении throws объявления метода. Давайте посмотрим на это на небольшом примере:
package com.journaldev.util;
public class Java7MultipleExceptions {
public static void main(String[] args) {
try{
rethrow("abc");
}catch(FirstException | SecondException | ThirdException e){
//below assignment will throw compile time exception since e is final
//e = new Exception();
System.out.println(e.getMessage());
}
}
static void rethrow(String s) throws FirstException, SecondException,
ThirdException {
try {
if (s.equals("First"))
throw new FirstException("First");
else if (s.equals("Second"))
throw new SecondException("Second");
else
throw new ThirdException("Third");
} catch (Exception e) {
//below assignment disables the improved rethrow exception type checking feature of Java 7
// e=new ThirdException();
throw e;
}
}
static class FirstException extends Exception {
public FirstException(String msg) {
super(msg);
}
}
static class SecondException extends Exception {
public SecondException(String msg) {
super(msg);
}
}
static class ThirdException extends Exception {
public ThirdException(String msg) {
super(msg);
}
}
}
Как видите, в методе rethrow
блок catch перехватывает Exception, но не является частью предложения throws. Компилятор Java 7 анализирует весь блок try, чтобы проверить, какие типы исключений выбрасываются, а затем повторно выбрасываются из блока catch. Обратите внимание, что этот анализ отключается, если вы изменяете аргумент блока catch. Дополнительная литература: Обработка исключений в Java.