programing

자바에서는 같은 캐치블록에서 두 개의 예외를 잡을 수 있습니까?

goodsources 2022. 11. 10. 20:54
반응형

자바에서는 같은 캐치블록에서 두 개의 예외를 잡을 수 있습니까?

두 가지 예외는 동일한 처리 논리가 필요하기 때문에 잡아야 합니다.나는 다음과 같은 것을 하고 싶다.

catch (Exception e, ExtendsRuntimeException re) {
    // common logic to handle both exceptions
}

각 캐치블록에 핸들러 코드가 중복되지 않도록 할 수 있습니까?

Java 7 이후

Java 7부터는 여러 예외 캐치가 지원됩니다.

구문은 다음과 같습니다.

try {
     // stuff
} catch (Exception1 | Exception2 ex) {
     // Handle both exceptions
}

스태틱 타입ex는, 리스트 되고 있는 예외의 가장 일반적인 슈퍼 타입입니다.재투구하면 좋은 기능이 있습니다.excatch에서 컴파일러는 나열된 예외 중 하나만 느려질 수 있다는 것을 알고 있습니다.


Java 6 이전 버전

Java 7 이전 버전에서는 이 문제를 해결하는 방법이 있지만, 이 방법들은 미숙하고 제한이 있는 경향이 있습니다.

어프로치 #1

try {
     // stuff
} catch (Exception1 ex) {
     handleException(ex);
} catch (Exception2 ex) {
     handleException(ex);
}

public void handleException(SuperException ex) {
     // handle exception here
}

예외 핸들러가 이전에 선언된 로컬 변수에 액세스해야 하는 경우 이 문제는 복잡해집니다.try핸들러 메서드가 예외를 재투입할 필요가 있는 경우(체크되어 있는 경우), 시그니처에 중대한 문제가 발생합니다.구체적으로는handleException투척으로 선언되어야 한다.SuperException... 즉, 동봉 메서드의 시그니처를 변경해야 할 가능성이 있습니다.

어프로치 #2

try {
     // stuff
} catch (SuperException ex) {
     if (ex instanceof Exception1 || ex instanceof Exception2) {
         // handle exception
     } else {
         throw ex;
     }
}

또, 시그니처에 문제가 발생할 가능성이 있습니다.

어프로치 #3

try {
     // stuff
} catch (SuperException ex) {
     if (ex instanceof Exception1 || ex instanceof Exception2) {
         // handle exception
     }
}

빼놓으면else부분(예를 들어 다른 아형이 없기 때문에)SuperException현재) 코드가 더 취약해집니다.예외 계층이 재구성된 경우 이 핸들러는 다음과 같이 처리되지 않습니다.else묵묵히 예외적으로 먹어버릴 수도 있어요!

Java <= 6.x에서는 각 캐치 블록에 대해 하나의 예외만 포착할 수 있습니다.

try {

} catch (ExceptionType name) {

} catch (ExceptionType name) {

}

문서:

각 캐치 블록은 예외 핸들러이며 인수에 의해 나타나는 예외 유형을 처리합니다.인수 유형 예외[Type] : 핸들러가 처리할 수 있는 예외 유형을 선언합니다.이 예외 유형은 Throwable 클래스에서 상속되는 클래스의 이름이어야 합니다.

Java 7의 경우 하나의 캐치블록에서 여러 예외를 검출할 수 있습니다.

catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

문서:

Java SE 7 이후에서는 단일 캐치 블록으로 여러 유형의 예외를 처리할 수 있습니다.이 기능을 통해 코드 중복을 줄이고 지나치게 광범위한 예외를 포착하려는 유혹을 줄일 수 있습니다.

레퍼런스: http://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html

Java 7을 사용하지 않을 경우 예외 처리를 메서드로 추출할 수 있습니다. 이렇게 하면 중복을 최소화할 수 있습니다.

try {
   // try something
}
catch(ExtendsRuntimeException e) { handleError(e); }
catch(Exception e) { handleError(e); }

Java <7의 경우 예외와 함께 if-else를 사용할 수 있습니다.

try {
    // common logic to handle both exceptions
} catch (Exception ex) {
    if (ex instanceof Exception1 || ex instanceof Exception2) {

    }
    else {
        throw ex;
        // or if you don't want to have to declare Exception use
        // throw new RuntimeException(ex);
    }
}

Throwable 편집 및 예외로 대체되었습니다.

Java SE 7이 출시되기 전에는 try block과 관련된 여러 catch 문장으로 코드를 작성하는 것이 습관이었습니다.매우 기본적인 예:

 try {
  // some instructions
} catch(ATypeException e) {
} catch(BTypeException e) {
} catch(CTypeException e) {
}

그러나 Java에 대한 최신 업데이트를 통해 여러 catch 문을 작성하는 대신 하나의 catch 절 내에서 여러 예외를 처리할 수 있습니다.이 기능을 실현하는 예를 다음에 나타냅니다.

try {
// some instructions
} catch(ATypeException|BTypeException|CTypeException ex) {
   throw e;
}

따라서 단일 catch 절에 여러 예외가 있으면 코드가 단순해질 뿐만 아니라 코드의 용장성도 줄어듭니다.저는 이 기능과 그 구현에 대해 잘 설명하는 이 기사를 발견했습니다.Java 7에서 개선되고 개선된 예외 처리: 이것도 도움이 될 수 있습니다.

http://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html에서는 같은 블록에서 여러 예외를 검출하는 방법에 대해 다룹니다.

 try {
     // your code
} catch (Exception1 | Exception2 ex) {
     // Handle 2 exceptions in Java 7
}

공부 카드를 만들고 있는데, 이 실이 도움이 되었어요. 제 의견을 말하고 싶었어요.

언급URL : https://stackoverflow.com/questions/11211286/is-it-possible-in-java-to-catch-two-exceptions-in-the-same-catch-block

반응형