[java] 동일한 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 (IOException | SQLException ex) {
  ...
}

그러나 모든 예외가 동일한 클래스 계층 구조에 속하는 경우 해당 기본 예외 유형을 간단히 잡을 수 있습니다.

또한 ExceptionB가 ExceptionA에서 직접 또는 간접적으로 상속되는 경우 동일한 블록에서 ExceptionA와 ExceptionB를 모두 잡을 수 없습니다. 컴파일러는 다음과 같이 불평합니다.

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


답변

Java 7 이전에는 아니지만 다음과 같이 할 것입니다.

자바 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();
}

보다 일반적인 경우에 RepositoryException이 기본 클래스이고 PathNotFoundException이 파생 클래스 인 경우 :

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

위의 코드는 한 종류의 예외 처리에 대해 RepositoryException 및 PathNotFoundException을 포착하며 다른 모든 예외는 함께 일괄 처리됩니다. Java 7부터 위의 @OscarRyz의 답변에 따라 :

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


답변

아니요, 고객 당 하나입니다.

모든 경우에 동일한 조치를 취하는 한 java.lang.Exception과 같은 수퍼 클래스를 잡을 수 있습니다.

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

그러나 이것이 최선의 방법이 아닐 수도 있습니다. 실제로 처리하기위한 전략이있는 경우에만 예외를 잡아야합니다. 로깅 및 재 투입은 “처리”가 아닙니다. 수정 조치가없는 경우 메소드 서명에 추가하고 상황을 처리 할 수있는 누군가에게 버블 링하도록하십시오.


답변

Java 6 (즉, Android)에 대한 user454322의 답변에 대한 깔끔하지만 덜 장황하고 바람직하지는 않은 대안은 모든 것을 잡고 Exception다시 던질 것 RuntimeException입니다. 이 것없는 작품 만약 당신이있는 거 (당신은 또한하지 않는 한 그들을 다시 던져) 더 스택까지 예외의 다른 유형을 잡기에 계획, 그러나 효과적으로 모든 잡을 것 확인 예외.

예를 들어 :

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
    }
}

즉, 자세한 내용은 부울 또는 다른 변수를 설정하고 try-catch 블록 다음에 일부 코드를 실행하는 것이 가장 좋습니다.


답변

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.
  }