jdk中动态代理异常处理分析:UndeclaredThrowableException
运行上面的MainTest,得到的异常堆栈为而我们期望的是在上述问题还原中,真实的SQLException被包装了两层,先被InvocationTargetException包装,再被UndeclaredThrowableException包装。其中,InvocationTargetException为受检异常,UndeclaredThrowableException为运行时异常。为何会被包装呢,还要从动态代理的生成的代理类说起。异常处理的逻辑是,对RuntimeException、接口已声明的异常、Error直接抛出,其他异常被包装成UndeclaredThrowableException抛出。再来看IServiceProxy的invoke方法,它就是直接通过反射执行目标方法,问题就在这里了。在实现InvocationHandler的invoke方法体中,对method.invoke;调用进行try catch,重新 throw InvocationTargetException的cause。因为Java继承原则:即子类覆盖父类或实现父接口的方法时,抛出的异常必须在原方法支持的异常列表之内。
用户评论