Skip to content

AOP增强两个嵌套调用的方法,子方法 afterReturning 主动执行ProcessController.throwsImmediately(new RuntimeException()); 存在的问题 #253

@z529192557

Description

@z529192557

问题一: 子方法抛出异常无法被上级调用者afterThrowing感知
问题二:子方法抛出的异常, 被子方法自身的的afterThrowing 感知
重现步骤:
image
对 final int checkState(int a) 方法在afterReturning的时候抛出异常,并关注该方法afterThrowing事件
同时也关注final void checkState()的afterThrowing事件

期望结果:final void checkState() 可以响应 afterThrowing 事件
实际结果:final int checkState(int a) 方法响应afterThrowing事件了,final void checkState()未响应afterThrowing事件

分析:
1.根据字节码增强规则,Spy.onReturn 相关代码处在Sandbox的try-catch 逻辑中,因此onReturn主动抛出的异常会被try-catch 捕获,触发当前方法的Spy.onThrows规则
2.由于Spy.onReturn和Spy.onThrows,都会触发EventListenerHandler.handleOnEnd ,导致

  • EventProcessor.Process 中执行两次出栈,造成栈错位
  • 如果父级调用是最顶层调用的话,多出一次出栈,会导致父级调用的栈缺失,触发EventListenerHandler.handleOnEnd中栈错位逻辑,流程快速返回,无法调用EventListener

3.使用了AdviceAdapterListener,在处理RETURN和IMMEDIATELY_RETURN 事件过程中,也会导致OpStack opStack 多次出栈,造成OpStack栈的错位

解决方案:
第一种方案: 同级调用中的Spy.onThrows 忽略 同级的Spy.onReturn中通过ProcessControlException 的THROWS_IMMEDIATELY事件抛出的异常,同时注意对齐栈的操作
第二种方案:ProcessControlException 的THROWS_IMMEDIATELY事件触发后,补齐EventProcessor.Process 和OpStack的栈

Metadata

Metadata

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions