Перебросить целевое исключение 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());
}
}