반응형

 

보통 자바에서는 try/catch 구문에서 다수의 exception을 다뤄줘야할 때 아래와 같이 사용한다.

 

try{
 ~~
}catch(Exception1 e1){
 ~~
}catch(Exception2 e2){
 ~~
}

 

하지만 너무 많은 catch문들이 존재하게 되면 코드가 번잡해지고 중복되는 코드가 많이 생길 수 있다.

 

예를 들어 에러에 대해 자세히 로그를 남기는 부분이 있는 반면,

이 catch문은 중요도가 낮기에 e.printStackTrace()로 빠르게 넘어가는 부분도 존재한다.

 

이러한 불편함을 해소하기 위해 JDK 1.7 이상 버전부터 Multi catch 구문을 제공하고 있다.

 

 

Multi catch 구문은 아래와 같은 방식으로 사용한다.

try{
 ~~
}catch(Exception1 | Exceptiion2 e){
 ~~
}

 

 

Multi catch 사용시 주의 사항

이때 Multi catch를 사용하기 위해 주의해야 하는 사항이 존재한다.

 

1. Multi Catch문에 사용된 예외들은 예외의 상속관계에서 부모와 자식관계에 있으면 안된다.

 

아래 코드는 catch문에 ArithmeticException와 RuntimeException을 동시에 처리하려 하고 있다.

try{
    
}catch (ArithmeticException | RuntimeException e) {
    
}

그러나 이대로 컴파일 하게되면 예외가 발생하게 되는데 ArithmeticException은 RuntimeException의 자손 클래스이기 때문에 RuntimeException 하나만으로 처리가 가능하기 때문이다.

 

따라서 해당 에러를 없애기 위해서는 아래와 같은 코드로 고쳐야 한다.

try{
    
}catch (RuntimeException e) {
           
}

 

 

2. Multi Catch문에 사용된 예외들의 공통된 조상의 멤버만 사용할 수 있다.

 Multi Catch문에서는 하나의 참조 변수(e)로 예외를 처리하는 것을 아래 코드를 통해 확인 할 수 있다.

try{
    
}catch (Exception1 | Exception2 | Exception3 e) {
    
}

 

이때 다시한번 생각해보면 예외가 발생했을 때 e라는 참조 변수가 가리키는 객체가 어느 예외 클래스의 인스턴스인지 알 수 없다.

 

따라서 예외가 발생하여 Exception1의 예외를 호출하기로 했는데 실제로 Exception2가 예외로 발생했을 때 Exception2는 Exception1의 예외가 없을지도 모른다.

 

 

즉 아래 코드는 e가 어느 예외인지 예측 불가능하므로 불가능한 코드가 된다.

try{

}catch(Exception1 | Exception2 | Exception3 e){
   e.exception1Method();
}

이러한 이유로 Multi catch 구문은 공통된 조상의 메서드만 호출하거나 정확이 어느 예외의 인스턴스인지 판단하여 캐스팅(형변환) 후 해당 메서드를 사용해야 한다.

 

Exception 1,2,3의 공통조상이 되는 parentsMethod()를 호출

try{
}catch(Exception1 | Exception2 | Exception3 e){
   e.parentsMethod();
}

 

해당 Exception이 어떤 예외의 인스턴스인지 판단하여 캐스팅

try{
}catch(Exception1 | Exception2 | Exception3 e){
   if(e instanceof Exception1){
       Exception1 e1 = (Exception1)e;
       e1.method1();
   } else if(e instanceof Exception2){
       Exception2 e2 = (Exception2)e;                   
       e2.method2();
   } else if(e instanceof Exception3){
       Exception3 e3 = (v)e;                   
       e3.method3();
   }
}

 

 

 

 

 

 

 

 

출처 :  https://dololak.tistory.com/61?category=636500

반응형