javax.interceptor.InvocationContext的proceed()方法是否会抛出除目标方法或插入代码之外的任何异常? InvocationTargetException怎么样?通常,文档在这一点上似乎不完整。
[编辑]我问:InvocationTargetException InvocationContext的实现者通常会抛出什么?或者是通常重新抛出的原始异常?或者是其他东西?
“投掷”声明允许所有例外,当然,但我想知道“合同”是什么?自然契约是保持调用目标方法的异常不变。当然,这不能在Java类型系统中表达。它没有记录或任何东西。因此,原则上,可以抛出任何异常。目标方法的例外原则上可以用任何方式包装;不仅仅是InvocationTargetException。
这肯定会带来建筑后果。如果InvocationContext的实现没有“契约”,则异常系统将变得几乎无用;基本上,我们能够知道的是,有一个例外。所以我问这样一个“契约”,即实现的预期行为:是否有一个?
答案 0 :(得分:0)
在运行时,编译器无法通过反射分析方法调用,因此它将它们包装到名为InvocationTargetException
的异常中。
调用构造函数时抛出InvocationTargetException 通过Constructor.newInstance()或一个名为through的方法 Method.invoke()抛出异常。 InvocationTargetException 封装抛出的异常,可以使用它来检索 getTargetException()。
您必须解开此异常才能获得原始根本原因。
根据记录,InvocationContext.proceed()
会引发java.lang.Exception
。它进一步调用调用行中的其他拦截器。
我没有遇到过任何问题,但是当使用嵌套拦截器时可能会发生这种情况。其中一个拦截器抛出异常,可能导致级联异常链。