Java 다중 예외 처리, 예외 다시 던지기

Java 7에서 catch 블록은 단일 catch 블록에서 여러 예외를 처리할 수 있도록 개선되었습니다. 여러 예외를 catch하고 그들이 유사한 코드를 가지고 있다면, 이 기능을 사용하면 코드 중복이 줄어듭니다. 이 기능을 예제를 통해 이해해 봅시다.

Java에서 여러 예외 catch하기

Java 7 이전에는 아래와 같이 하나씩 여러 예외를 catch했습니다.

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할 수 있습니다:

catch(IOException | SQLException ex){
     logger.error(ex);
     throw new MyException(ex.getMessage());
}

만약 catch 블록이 여러 예외를 처리하면, 파이프(|)로 구분할 수 있으며, 이 경우 예외 매개변수 (ex)는 final이므로 변경할 수 없습니다. 이 기능으로 생성된 바이트 코드는 더 작아지며 코드 중복이 감소합니다.

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가 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) {
			//아래 할당은 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