2012-04-18 14 views
7

InvocationTargetExceptionのターゲット例外をどのように再スローしますか?私はリフレクションを使用して自分のクラスの中でinvoke()メソッドを呼び出すメソッドを持っています。しかし、コード内に例外がスローされた場合、私はInvocationTargetExceptionを気にせず、ターゲット例外のみを必要とします。ここに例があります:InvocationTargetExceptionターゲット例外を再スローする

public static Object executeViewComponent(String name, Component c, 
     HttpServletRequest request) throws Exception { 

    try { 
     return c.getClass() 
       .getMethod(c.getMetaData().getMethod(), HttpServletRequest.class) 
       .invoke(c, request); 
    } catch (InvocationTargetException e) { 
     // throw the target exception here 
    } 
} 

私が直面している主な問題は、呼び出しているe.getCause(); ExceptionをスローしないでThrowableをスローします。おそらく私はこれに間違って近づいていますか?

catch (XXXException e) 
{ 
     throw e; 
} 

答えて

12
catch (InvocationTargetException e) { 
    if (e.getCause() instanceof Exception) { 
     throw (Exception) e.getCause(); 
    } 
    else { 
     // decide what you want to do. The cause is probably an error, or it's null. 
    } 
} 
+0

+1型チェックの追加。 –

+0

InvocationTargetExceptionに対してどのように 'null'の原因がありますか? –

+0

この例外がMethod.invoke()によってスローされたときは、これが原因ではないと思いますが、InvocationTargetExceptionにはnullターゲットを許可するコンストラクタがあるため、nullの可能性があります。例外がスローされたInvocationTargetException内にエラーがラップされている場合、私はMethod.invoke APIのdocから確かにわかりません。 –

0

あなたはthrowキーワードと、あなたがキャッチ対応するオブジェクトを使用して、前にキャッチされた例外を再スローすることができます。コンパイラがExceptionを投げていると思うようにしたい場合は、おそらくそれをキャストする必要があります。

throw (Exception) e.getCause(); 
+0

OPはInvocationTargetExceptionの原因を望んでいます –

+0

これはちょうど同じ例外をスローします。私はInvocationTargetExceptionを "食べ"、ターゲットExceptionだけを投げたい。 –

+0

する必要があります:スロー(例外)e.getCause(); (Tim Benderが言ったように) – Stephan

2

Exception#getCauseThrowableを返します。

-1

あなたはそれを明示的に宣言しなくても、原因を再スローすることができます。

public static Object executeViewComponent(String name, Component c, 
     HttpServletRequest request) throw /* known exceptions */ { 

    try { 
     return c.getClass() 
       .getMethod(c.getMetaData().getMethod(), HttpServletRequest.class) 
       .invoke(c, request); 
    } catch (InvocationTargetException e) { 
     // rethrow any exception. 
     Thread.currentThread().stop(e.getCause()); 
    } 
} 
+0

それは動作しますが、危険です。 stop()メソッドは推奨されていません。これはstop()からのA​​PIです。docs:Deprecatedこのメソッドは、本質的に安全ではありません。詳細については、stop()を参照してください。このメソッドの追加の危険性は、ターゲットスレッドが処理する準備ができていない例外を生成するために使用される可能性があることです(スレッドがスローできなかったチェック例外を含む)。詳細については、なぜThread.stop、Thread.suspend、およびThread.resume Deprecated?を参照してください。 – dgt

0

以下は冗長ですが、反射とキャストは避けてください。 Java 7のマルチキャッチ構文が有用であるとは思っていませんが、わかりません。

public static Object executeViewComponent(String name, Component c, 
     HttpServletRequest request) throw KnownException_1 , KnownException_2 , ... , KnownException_n { 

    try { 
     return c.getClass() 
       .getMethod(c.getMetaData().getMethod(), HttpServletRequest.class) 
       .invoke(c, request); 
    } 
    catch (InvocationTargetException cause) 
    { 
      assert cause . getCause () != null : "Null Cause" ; 
      try 
      { 
       throw cause . getCause () ; 
      } 
      catch (KnownException_1 c) 
      { 
       throw c 
      } 
      catch (KnownException_2 c) 
      { 
       throw c 
      } 
      ... 
      catch (KnownException_n c) 
      { 
       throw c 
      } 
      catch (RuntimeException c) 
      { 
       throw c ; 
      } 
      catch (Error c) 
      { 
       throw c ; 
      } 
      catch (Throwable c) 
      { 
       assert false : "Unknown Cause" ; 
      } 
    } 
}