You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套方法调用故障处理异常:局部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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 22:12:48