2012-06-15 2 views
2

Method.invoke 메서드에서 메서드가 호출 될 때 코드에서 예외를 catch 할 수없는 것 같습니다. 방법 자체에서 그것을 어떻게 잡을 수 있습니까?Java : Method.invoke 내에서 작성된 예외를 catch하는 방법은 무엇입니까?

void function() { 
    try { 
    // code that throws exception 
    } 
    catch(Exception e) { 
    // it never gets here!! It goes straight to the try catch near the invoke 
    } 
} 

try { 
    return method.invoke(callTarget, args); 
} 
catch(InvocationTargetException e) { 
    // exception thrown in code that throws exception get here! 
} 

고마워요!

+0

일반적으로 말하는 예외는 Exception이라는 이름으로 끝나며 오류는 Error라는 이름으로 끝납니다. 오류와 예외는 같은 것이 아닙니다. –

답변

3

이유 중 하나는 UnsatisfiedLinkErrorException의 서브 클래스되지 않는 것입니다. 사실 Error의 하위 클래스입니다.

오류 예외를 catch하는 데주의해야합니다. 그들은 거의 항상 무언가가 실제로 악화되었음을 나타내며, 대부분의 경우 안전하게 복구 할 수 없습니다. 예를 들어, UnsatisfiedLinkError은 JVM이 기본 라이브러리를 찾을 수 없다는 것을 의미하며, 해당 라이브러리에 의존하는 모든 것이 (아마도) 사용할 수 없다는 것을 의미합니다. 일반적으로 말하기. Error 예외는 치명적인 오류로 처리해야합니다.

4

당신은 function()

에서 던진 예외를 반환합니다 그 getCause() 방법을 확인하여 MethodInvocationException의 진짜 원인을 얻을 수 있습니다 : 당신은 당신에 도달하기 위해 반환 된 예외에 재귀 getCause()를 호출 할 필요가 있습니다.

하십시오 Throwable 반환 getCause(), 당신은 실제 유형을 확인해야합니다 (예를 들어 instanceof 또는 getClass())

: getCause() 반환 null 더 이상 "원인"사용할 수없는 경우 -

: 당신이 던져 execption의 기본 원인

업데이트에 도착했습니다 모든 특정 오류를 선언하지 않으려면 function()catch(Throwable) 또는 catch(Error) 중 하나를 선언 - function()catch() 실행하기되지 않는 이유

이유는 xxxErrorException되지 않습니다, 그래서 당신의 catch 그것을 잡을 것입니다 - - 이것은 일반적으로 나쁜 아이디어입니다 (무엇을 OutOfMemoryError?와 함께 디오로 갈 예정입니까?).

+0

당신이 말한 것은 제가이 문제를 이해하도록 도왔습니다. 예외를 잡기 위해 예외를 사용할 수없는 것 같습니다. 필자가 생각하기에, invoke로부터 호출 할 때 그것을 잡을 수 있으려면 정확한 예외 타입을 지정해야한다. 예 : catch (예외 e) 대신 catch (UnsatisfiedLinkError e)가 사용됩니다. ' – MasterPlanMan

+2

@ user1459231 - 방금 글씨를 읽었습니다. 문제는'xxxError'가'Exception'이 아니기 때문에'catch'가 catch하지 않을 것입니다.'function()'에서'catch (Throwable)'또는'catch (Error)'를 선언하십시오. – Attila

+1

오류 및 예외는 모두 Throwable을 확장하지만 오류는 Exception의 하위 클래스가 아니며 catch되지 않습니다. Throwable을 잡아서 두 가지를 모두 얻을 수는 있지만, (이것은 충분히 강조 할 수 없습니다.) 이것은 매우 형편이 아니며 나중에 문제를 일으킬 수 있습니다. 특히 StackOverflowError 같은 것을 잡아낼 것이기 때문에, 실제로 코드에서 처리 할 준비가되어 있지 않습니다. – Thomas

0

정상적으로 예외를 발생시킵니다. 그것의 내부 호출이 아무런 효과가 없다는 사실.

public class B { 
    public static void function() { 
     try { 
      throw new Exception(); 
     } catch (Exception e) { 
      System.err.println("Caught normally"); 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String... args) throws NoSuchMethodException, IllegalAccessException { 
     Method method = B.class.getMethod("function"); 
     Object callTarget = null; 
     try { 
      method.invoke(callTarget, args); 
     } catch (InvocationTargetException e) { 
      // should never get called. 
      throw new AssertionError(e); 
     } 
    } 
} 

인쇄

Caught normally 
java.lang.Exception 
at B.function(B.java:15) 
... deleted ... 
at B.main(B.java:26) 
... deleted ... 
0

MethodInvocationException 당신이 방법 잘못된 전화하는거야 의미, 그것은 심지어 try 블록 내부에 못했을 것이다. 문서에서 :

Signals that the method with the specified signature could not be invoked with the provided arguments. 

편집 : 이것이 Spring MethodInvokationException 인 경우 Apache Velocity가 예외 예외를 래핑합니다. 당신이 ExceptionUnsatisfiedLinkError을 잡을 수 없어