zoukankan      html  css  js  c++  java
  • Dubbo返回自定义异常之UndeclaredThrowableException、InvocationTargetException

    Dubbo Provider返回异常,可查看 ExceptionFilter.onSuccess方法,逻辑就不说了,说结论:

    • 如果接口继承了GenericService,直接放回异常(没试过)
    • 如果返回的 是Exception,且不是RumTimeException,直接返回异常(可以理解为检查异常吗~~~)
    • 如果是该异常在接口上异常抛出的类型,直接返回异常
    • 异常类和接口类,放在一个jar里
    • 如果异常包名 以 java.或者javax.开头,直接返回(可以理解为jdk自带的吗~~~)
    • 如果是RpcException,直接返回
    • 其他,返回 new RunTimeException(StringUtils.toString(exception))

    但是,Spring那边抛出的异常出现了 UndeclaredThrowableException、InvocationTargetException

    这就涉及到java基础部分

    首先反射部分,通过Method.invoke调用方法时,被调用方法出现里异常,则会抛出 InvocationTargetException

    public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, nvocationTargetException

    再之后是动态代理的异常,jdk动态代理生成代码张这样

    public final void test() throws BaseException {//BaseException为自定义异常
            try {
                super.h.invoke(this, m3, (Object[])null);
            } catch (RuntimeException | Error var2) {
                throw var2;
            } catch (Throwable var3) {
                throw new UndeclaredThrowableException(var3);
            }
        }

    由上图可知,当被代理的方法调用,抛出了非 RuntimeException或者Error时,便抛出UndeclaredThrowableException

    解决Dubbo自定义异常方案:

    1、UndeclaredThrowableException.getUndeclaredThrowable()获取InvocationTargetException,

    InvocationTargetException.getTargetException()便可获取实际对象

    2、将异常类和接口放在一起

    3、自定义实现ExceptionFilter:

    <dubbo:provider filter="customExceptionFilter,-exception" ></dubbo:provider>
  • 相关阅读:
    PIE-SDK For C++栅格数据的金字塔创建
    PIE-SDK For C++栅格数据集的读写
    PIE-SDK For C++栅格数据集的读取
    PIE-SDK For C++内存栅格数据的创建
    【系列文章】数据结构与算法——图
    大小端模式
    几种常见的排序方法(C语言实现)
    WPF——数据绑定(二)绑定方法—绑定本地对象
    WPF——数据绑定(一)什么是数据绑定
    WPF多窗口传参解决方案
  • 原文地址:https://www.cnblogs.com/jaxlove-it/p/12411532.html
Copyright © 2011-2022 走看看