Перехват множества исключений в Java, повторное возбуждение исключения

В Java 7 блок catch был улучшен для обработки нескольких исключений в одном блоке catch. Если вы перехватываете несколько исключений и у них схожий код, использование этой функции позволит уменьшить дублирование кода. Давайте разберем функцию перехвата нескольких исключений в Java на примере.

Перехват нескольких исключений в Java

До Java 7 мы перехватывали несколько исключений поочередно, как показано ниже.

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 обрабатывает несколько исключений, вы можете разделять их с использованием символа “pipe” (|), и в этом случае параметр исключения (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){
			//ниже приведенное присваивание вызовет исключение времени компиляции, так как e является финальным
			//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) {
			//ниже приведенное присваивание отключает улучшенную проверку типа исключения при повторном выбрасывании функции 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 перехватывает исключение, но это не часть списка throws. Компилятор Java 7 анализирует полный блок try, чтобы проверить, какие типы исключений выбрасываются, а затем повторно выбрасываются из блока catch. Обратите внимание, что этот анализ отключается, если изменить аргумент блока catch. Дополнительное чтение: Обработка исключений в Java.

Source:
https://www.digitalocean.com/community/tutorials/java-catch-multiple-exceptions-rethrow-exception