3

从 Method.invoke 方法调用该方法时,我似乎无法在代码中捕获异常。如何从方法本身内部捕获它?

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

谢谢!

4

4 回答 4

5

MethodInvocationException您可以通过检查它的方法来获得真正的原因,该getCause()方法将返回抛出的异常function()

注意:您可能需要getCause()递归调用返回的异常才能到达您的异常。

注意getCause()返回 a Throwable,您必须检查其实际类型(例如instanceofor getClass()

注意:如果没有更多的“原因”可用,则getCause()返回null——你已经到达了抛出 execption 的基本原因

更新

catch()infunction()没有被执行的原因是它xxxError不是一个Exception,所以你catch不会抓住它——如果你不想声明所有特定的错误,请声明或者声明——请注意,这通常是一个坏主意catch(Throwable)(你打算用一个 dio 做什么?catch(Error)function()OutOfMemoryError

于 2012-06-15T16:38:50.507 回答
4

您无法理解的一个原因UnsatisfiedLinkErrorExceptionUnsatisfiedLinkError不是Exception. 事实上,它是 的子类Error

您应该小心捕捉错误异常。它们几乎总是表明发生了非常糟糕的事情,并且在大多数情况下,不可能安全地从它们中恢复过来。例如,anUnsatisfiedLinkError意味着 JVM 找不到本机库……并且依赖于该库的任何东西(可能)都无法使用。一般来说。Error异常应被视为致命错误。

于 2012-06-15T16:44:22.787 回答
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 ...
于 2012-06-15T16:39:09.903 回答
0

MethodInvocationException意味着您调用错误的方法,它甚至不应该进入您的 try 块。从文档:

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

编辑:如果这是 Spring MethodInvokationException,则 Apache Velocity 确实包装了函数异常。

于 2012-06-15T16:43:54.390 回答