자바에서는 같은 캐치블록에서 두 개의 예외를 잡을 수 있습니까?
두 가지 예외는 동일한 처리 논리가 필요하기 때문에 잡아야 합니다.나는 다음과 같은 것을 하고 싶다.
catch (Exception e, ExtendsRuntimeException re) {
// common logic to handle both exceptions
}
각 캐치블록에 핸들러 코드가 중복되지 않도록 할 수 있습니까?
Java 7 이후
구문은 다음과 같습니다.
try {
// stuff
} catch (Exception1 | Exception2 ex) {
// Handle both exceptions
}
스태틱 타입ex
는, 리스트 되고 있는 예외의 가장 일반적인 슈퍼 타입입니다.재투구하면 좋은 기능이 있습니다.ex
catch에서 컴파일러는 나열된 예외 중 하나만 느려질 수 있다는 것을 알고 있습니다.
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
'programing' 카테고리의 다른 글
C에서 *ptr += 1과 *ptr++ 사이의 차이 (0) | 2022.11.10 |
---|---|
Vuex 상태 boolen 속성이 정의되지 않음으로 표시됨 (0) | 2022.11.10 |
java.lang에 대해서Thread.State: WAITING(주차) (0) | 2022.11.10 |
Java를 사용하여 기본 웹 브라우저를 여는 방법 (0) | 2022.11.10 |
PHP를 사용하여 문자열의 처음 4자 제거 (0) | 2022.11.10 |