当前位置:   article > 正文

动态代理没有捕捉到自定义的异常(抛出UndeclaredThrowableException异常)_动态代理抛出自定义异常

动态代理抛出自定义异常

原始做法

  在程序中想要作为一个提示信息,并且中断程序来抛出一个异常Exception,但是却抛出了java.lang.reflect.UndeclaredThrowableException这个异常。

原因

  (1)首先要了解编译期异常和运行时异常
  (2)如果一个异常是检查型异常并且没有在动态代理的接口处声明,那么它将会被包装成UndeclaredThrowableException.
而我们定义的自定义异常,被定义成了检查型异常,导致被包装成了UndeclaredThrowableException

解决方法

(1)接口中要声明了该异常,就可以正常抛出。
(2)当我们使用JDK动态代理的时候,可以捕获 method.invoke(target, args) 抛出的 InvocationTargetException 异常。
(3)改成运行时异常。

补充:
在spring提供的反射工具reflectUtils中,除了运行时异常可以直接抛出信息外,其余的异常将抛出UndeclaredThrowableException后才会抛出自定义的信息

//源码如下
public static void rethrowRuntimeException(Throwable ex){
	if(ex instanceof RuntimeException){
		throw (RuntimeException) ex;
	}
	if(ex instanceof Error){
		throw(Error) ex;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

可以看到,该方法只是判断了运行时异常和Error;并原样抛出;怎么理解这个方法的调用?原因很简单,InvocationTargetException是在method.invoke的时候抛出的,方法在执行的过程中,方法本身的执行可能抛出RuntimeException或者Error,其余方法本身抛出的Exception异常直接包装为UndeclaredThrowableException(RuntimeException)处理;
统一下来,可以这样理解,除了在反射执行过程中遇到的Error,其余所有的Exception,都被统一转成了RuntimeException;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/83613
推荐阅读
相关标签
  

闽ICP备14008679号