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

如何在Karate中捕获org.graalvm.polyglot.PolyglotException并溯源原异常?

解决Karate调用Java类时PolyglotException隐藏原异常的问题

当Karate调用Java类抛出org.graalvm.polyglot.PolyglotException时,实际根源通常是NPE、连接超时这类运行时异常。要在HTML测试报告中展示原异常细节,可通过以下两种方案实现:

方案一:改造Java工具类,包装原异常

在Java代码中捕获内部异常,重新抛出带原异常栈的RuntimeException,避免GraalVM完全封装异常:

public class TestUtil{
    public static void execute(){
        try {
            Long unexpectedVal = SomeInternalClass.getValue(); 
            SomeInternalImpl.processAndValidate(unexpectedVal.toString());
        } catch (Exception e) {
            // 保留原异常栈轨迹,抛出可被Karate直接识别的RuntimeException
            throw new RuntimeException("TestUtil执行失败", e);
        }
    }
}

方案二:在Karate特性文件中解析PolyglotException

如果无法修改Java类,可在Karate中直接解析PolyglotException的getCause()方法获取原异常:

改造后的Karate特性文件

Background:
  * def TestUtil = Java.type("pkg.TestUtil")

Scenario: 捕获并展示原异常
  * try (
      TestUtil.execute();
    ) catch (polyglotEx) {
      # 提取原异常
      def originalException = polyglotEx.getCause()
      # 打印原异常详情到日志和报告
      karate.log("原异常类型: " + originalException.getClass().getName())
      karate.log("原异常信息: " + originalException.getMessage())
      # 标记步骤失败并携带原异常,HTML报告会自动记录栈轨迹
      karate.fail("执行TestUtil失败,原异常:" + originalException.getMessage(), originalException)
    }

效果验证

执行用例后,HTML测试报告中会显示原异常(如NullPointerException)的完整栈轨迹,而非仅展示PolyglotException,便于快速定位问题根源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:20:06