如何在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
相关产品推荐
相关产品推荐

