programing

동일한 catch 절에서 여러 Java 예외를 잡을 수 있습니까?

copyandpastes 2022. 7. 2. 21:43
반응형

동일한 catch 절에서 여러 Java 예외를 잡을 수 있습니까?

Java에서는 다음과 같은 작업을 수행합니다.

try {
    ...     
} catch (/* code to catch IllegalArgumentException, SecurityException, 
            IllegalAccessException, and NoSuchFieldException at the same time */) {
   someCode();
}

...의 대상:

try {
    ...     
} catch (IllegalArgumentException e) {
    someCode();
} catch (SecurityException e) {
    someCode();
} catch (IllegalAccessException e) {
    someCode();
} catch (NoSuchFieldException e) {
    someCode();
}

어떻게 할 수 있을까요?

이는 Java 7부터 가능했습니다.멀티캐치 블록의 구문은 다음과 같습니다.

try { 
  ...
} catch (IllegalArgumentException | SecurityException | IllegalAccessException |
            NoSuchFieldException e) { 
  someCode();
}

단, 모든 예외가 동일한 클래스 계층에 속할 경우 해당 기본 예외 유형을 쉽게 파악할 수 있습니다.

또한 둘 다 잡을 수 없습니다.ExceptionA그리고.ExceptionB만약이라면 같은 블록에ExceptionB에서 직접 또는 간접적으로 상속됩니다.ExceptionA컴파일러는 다음과 같이 불평합니다.

Alternatives in a multi-catch statement cannot be related by subclassing
  Alternative ExceptionB is a subclass of alternative ExceptionA

이 문제를 해결하려면 예외 목록에 상위 예외만 포함하면 됩니다. 하위 유형의 예외도 포함되기 때문입니다.

Java 7 이전까지는 아니지만 다음과 같은 작업을 수행합니다.

Java 6 이전 버전

try {
  //.....
} catch (Exception exc) {
  if (exc instanceof IllegalArgumentException || exc instanceof SecurityException || 
     exc instanceof IllegalAccessException || exc instanceof NoSuchFieldException ) {

     someCode();

  } else if (exc instanceof RuntimeException) {
     throw (RuntimeException) exc;     

  } else {
    throw new RuntimeException(exc);
  }

}



자바 7

try {
  //.....
} catch ( IllegalArgumentException | SecurityException |
         IllegalAccessException |NoSuchFieldException exc) {
  someCode();
}

Java 7 내에서 다음과 같은 여러 catch 구를 정의할 수 있습니다.

catch (IllegalArgumentException | SecurityException e)
{
    ...
}

예외 계층이 있는 경우 기본 클래스를 사용하여 예외의 모든 하위 클래스를 검색할 수 있습니다.퇴화된 경우 다음과 같은 방법으로 모든 Java 예외를 포착할 수 있습니다.

try {
   ...
} catch (Exception e) {
   someCode();
}

Repository가 다음과 같은 경우예외는 기본 클래스이고 PathNotFoundException은 파생 클래스입니다.

try {
   ...
} catch (RepositoryException re) {
   someCode();
} catch (Exception e) {
   someCode();
}

위의 코드는 Repository를 캡처합니다.Exception과 PathNotFoundException은 한 종류의 예외 처리 및 기타 모든 예외로 묶입니다.Java 7 이후, 위의 @OscarRyz의 답변에 따르면:

try { 
  ...
} catch( IOException | SQLException ex ) { 
  ...
}

아니요, Java 7 이전 버전에서는 고객 1인당 1개입니다.

java.lang 같은 슈퍼클래스를 탈 수 있습니다.예외. 모든 경우에 동일한 액션을 취하는 한.

try {
    // some code
} catch(Exception e) { //All exceptions are caught here as all are inheriting java.lang.Exception
    e.printStackTrace();
}

하지만 그것은 최선의 방법이 아닐 수도 있다.예외를 실제로 처리하는 전략이 있고 기록 및 재투입이 "처리"가 아닌 경우에만 예외를 포착해야 합니다.수정 조치가 없는 경우 메서드 서명에 추가하고 해당 상황을 처리할 수 있는 사람에게 버블업되도록 하는 것이 좋습니다.

JDK 7 이후에서는, 다음의 조작을 실행할 수 있습니다.

try {
    ...     
} catch (IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e) {
    someCode();
}

Java 6(즉 Android)에서 사용자 454322의 답변에 대한 보다 깔끔한 답변(단, 덜 상세하고 아마도 선호하지 않을 수 있음)은 모든 것을 파악하는 것입니다.Exception및 재투구RuntimeExceptions. 스택 상부에서 다른 유형의 예외를 캐치할 계획(재투입하지 않는 한)이라면 이 방법은 작동하지 않지만 체크된 모든 예외를 효과적으로 캐치할 수 있습니다.

예:

try {
    // CODE THAT THROWS EXCEPTION
} catch (Exception e) {
    if (e instanceof RuntimeException) {
        // this exception was not expected, so re-throw it
        throw e;
    } else {
        // YOUR CODE FOR ALL CHECKED EXCEPTIONS
    } 
}

즉, 상세도를 위해 부울 또는 다른 변수를 설정하고 이를 바탕으로 트라이캐치 블록 후에 코드를 실행하는 것이 가장 좋습니다.

7세 이전 버전에서는 어떻습니까?

  Boolean   caught = true;
  Exception e;
  try {
     ...
     caught = false;
  } catch (TransformerException te) {
     e = te;
  } catch (SocketException se) {
     e = se;
  } catch (IOException ie) {
     e = ie;
  }
  if (caught) {
     someCode(); // You can reference Exception e here.
  }

매우 간단합니다.

try { 
  // Your code here.
} catch (IllegalArgumentException | SecurityException | IllegalAccessException |
            NoSuchFieldException e) { 
  // Handle exception here.
}

Kotlin의 경우 현재로선 불가능하지만 추가가 검토되고 있습니다.출처
" " 금금으으간간로로서서", ",의의속속속속속속:

try {
    // code
} catch(ex:Exception) {
    when(ex) {
        is SomeException,
        is AnotherException -> {
            // handle
        }
        else -> throw ex
    }
}

예외 계층에서 부모 클래스가 될 수 있는 예외를 포착합니다.이것은 물론 나쁜 관행이다.이 경우 일반적인 부모 예외는 Exception 클래스가 됩니다.예외 인스턴스인 예외를 잡는 것은 Null Pointer와 같은 예외입니다.예외는 보통 프로그래밍 오류이며 보통 null 값을 확인하여 해결해야 합니다.

언급URL : https://stackoverflow.com/questions/3495926/can-i-catch-multiple-java-exceptions-in-the-same-catch-clause

반응형