웹사이트 검색

Java Catch Multiple Exceptions, Rethrow 예외


Java 7에서는 단일 catch 블록에서 여러 예외를 처리하도록 catch 블록이 개선되었습니다. 여러 예외를 포착하고 유사한 코드가 있는 경우 이 기능을 사용하면 코드 중복을 줄일 수 있습니다. 예제를 통해 Java catch multiple exceptions 기능을 이해해 봅시다.

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

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

catch 블록이 여러 예외를 처리하는 경우 파이프(|)를 사용하여 구분할 수 있으며 이 경우 예외 매개변수(ex)가 최종이므로 변경할 수 없습니다. 이 기능으로 생성된 바이트 코드는 더 작고 코드 중복을 줄입니다.

Java 재전송 예외

다시 발생한 예외에 대한 컴파일러 분석에서 또 다른 개선이 이루어졌습니다. Java rethrow 예외를 사용하면 메소드 선언의 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 블록은 예외를 catch하지만 throws 절의 일부는 아닙니다. Java 7 컴파일러는 전체 try 블록을 분석하여 어떤 유형의 예외가 발생했는지 확인한 다음 catch 블록에서 다시 발생합니다. catch 블록 인수를 변경하면 이 분석이 비활성화됩니다. 더 읽을 거리: Java의 예외 처리.