-
Notifications
You must be signed in to change notification settings - Fork 8.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
TCC模式下,开启它的useTCCFence功能,在rollback方法中抛出一个异常,业务系统服务捕获到的异常信息为null #6665
Comments
抱歉我误认为一阶段的异常了。不过这个二阶段的下发是异步的,即便按照你说的方式进行处理,业务又要如何感知呢? |
是的,rollback是异步的,业务系统捕获不到,但在看日志的时候,如果这样处理能更直观的看到错误栈 |
我觉得可以,欢迎你提交一个pr来优化这个问题 |
好,我会尝试提一个pr进行优化 |
Ⅰ. Issue Description
TCC模式下,开启它的useTCCFence功能,在rollback方法中抛出一个异常,业务系统服务捕获到的异常信息为null
Ⅱ. Describe what happened
TCC模式下,开启useTCCFence功能,在触发rollback的时候,会调到【io.seata.rm.tcc.TCCFenceHandler#updateStatusAndInvokeTargetMethod】,这里会使用jdk的反射去调用业务系统的rollback方法,如果rollback方法出现异常,业务系统的异常信息会被吃掉,因为jdk反射method.invoke()方法为了对异常做统一处理,会把业务异常统一包装成InvocationTargetException类型。
业务系统服务错误栈如下:
Ⅲ. Describe what you expected to happen
在rollback方法中如果抛出异常信息后,业务系统可以获取到更加直观的异常信息
Ⅳ. How to reproduce it (as minimally and precisely as possible)
参考mybatis【org.apache.ibatis.reflection.ExceptionUtil#unwrapThrowable】对 反射调用方法抛出异常【InvocationTargetException】 or 对代理对象调用方法抛出异常【UndeclaredThrowableException】的处理,在捕获到异常类型是【InvocationTargetException】 、【UndeclaredThrowableException】,调用异常对象的【getTargetException】方法,以获取到被包装的原始异常对象,然后再抛出这个原始异常对象,这样业务系统就可以获取到更加直观的异常信息
优化后抛出的异常信息如下:
Ⅴ. Anything else we need to know?
我的想法是在seata-tcc模块里面新建一个ExceptionUtil类,并提供一个unwarp方法,在有反射方法调用的地方,需要捕获这个异常,并调用【ExceptionUtil】工具类做一层异常转换后再抛出这个异常。
如果认定这是一个 优化,我可以尝试提交修改的 PR ~~~
Ⅵ. Environment:
JDK version(e.g. java -version): 11
Seata client/server version: 1.8.0
Database version: 8.0.29
The text was updated successfully, but these errors were encountered: