嵌套方法调用故障处理异常:局部Scope未捕获故障的解决咨询
问题原因
你通过findByPId@Output1调用方法属于跨端口调用,哪怕是同一个服务的输出端口,这种调用会创建独立的执行上下文,抛出的故障会沿着调用链路直接传到init块里的全局故障处理器,而不会被当前findId作用域内的处理器捕获。
解决方案
给你两种实用的修复方式:
方式一:直接本地调用(推荐)
既然findByPId是同一个服务里的方法,完全没必要走输出端口,直接本地调用就能让故障在当前执行上下文传播,被findId作用域的处理器捕获。
修改addP里的调用代码:
// 替换原来带@Output1的调用 findByPId(request.pId)(responseData)
方式二:调用时用onFault显式捕获
如果业务上必须通过输出端口调用,可以在调用语句上附加onFault块,让它优先捕获故障:
修改addP中的调用部分:
println@Console( "Before calling findByPId : ")() findByPId@Output1 (request.pId)(responseData) { onFault DataNotFound { println@Console( "addP: Data not found!! New value can be added." )() } } println@Console( "Response from findByPId : " + responseData.pName )();
这种写法会让当前onFault块优先处理故障,不会触发全局处理器。
补充说明
- Jolie里,本地方法调用(不带@端口名)会在当前作用域的执行上下文里运行,作用域内的故障处理器能正常生效。
- 跨端口调用(哪怕是本地服务的输出端口)会启动新的执行上下文,故障默认会传到调用方的全局处理器,除非在调用时用
onFault拦截,或者在被调用方法内部处理。
内容的提问来源于stack exchange,提问作者Srikanth Chakravarthy
相关产品推荐
相关产品推荐

