Перебросить целевое исключение InvocationTargetException

Как перебросить целевое исключение InvocationTargetException. У меня есть метод, который использует отражение для вызова метода invoke() в одном из моих классов. Однако, если в моем коде есть исключение, я не беспокоюсь об 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
    }
}

Основная проблема, с которой я сталкиваюсь, заключается в вызове throw e.getCause(); не выбрасывает исключение, а бросает Throwable. Возможно, я подхожу к этому неправильно?

5 ответов

Решение
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.
    }
}

Exception#getCause возвращает Throwable, Если вы хотите, чтобы компилятор думал, что вы бросаете Exception тогда вам, вероятно, нужно разыграть его.

throw (Exception) e.getCause();

Ниже подробно, но мне нравится избегать размышлений и кастинга. Я не думаю (но не уверен), что синтаксис multi catch в 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" ;
          }
    }
}

Вы можете перебросить любое исключение, которое вы поймали раньше, используя ключевое слово throw и соответствующий объект, который вы поймали:

catch (XXXException e)
{
       throw e;
}

Вы можете сбросить причину, не объявив ее явно.

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());
    }
}
Другие вопросы по тегам