Поиск по сайту:

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.