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

Apache Camel:doCatch的onWhen断言无法获取EXCEPTION_CAUGHT求助

Apache Camel doCatch onWhen 无法获取异常的原因及解决思路

这确实是Apache Camel的设计特性,核心原因是**onWhen的执行时机早于异常被存入Exchange.EXCEPTION_CAUGHT属性的时机**:Camel会先评估onWhen的断言逻辑,确认是否要进入doCatch分支,之后才会把捕获的异常绑定到Exchange的EXCEPTION_CAUGHT属性中。而doCatch内部的处理器是在异常绑定完成后执行的,所以能正常获取到该属性。

以下是几种可行的解决思路:

  • 用Simple表达式直接访问异常
    Camel在onWhen的表达式上下文里内置了${exception}变量,直接指向当前捕获的异常,可直接用它判断异常消息:

    doCatch(ProcessingException.class)
        .onWhen(simple("${exception.message} contains '需要匹配的特定消息'"))
        .process(new MyProcessor());
    
  • 自定义Predicate时使用exchange.getException()
    如果需要更复杂的判断逻辑,自定义Predicate时不要依赖Exchange.EXCEPTION_CAUGHT属性,改用exchange.getException()方法——这个方法在onWhen阶段可以直接拿到当前捕获的异常:

    doCatch(ProcessingException.class)
        .onWhen(exchange -> {
            Exception caughtEx = exchange.getException();
            return caughtEx instanceof ProcessingException 
                && caughtEx.getMessage() != null 
                && caughtEx.getMessage().contains("目标异常消息");
        })
        .process(new MyProcessor());
    
  • 其他表达式语言的适配用法
    如果你使用OGNL、SpEL等其他表达式语言,同样可以直接访问上下文里的异常对象,比如OGNL语法可以写exception.message.contains('目标内容')来做判断。

内容的提问来源于stack exchange,提问作者WesternGun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:06:18