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

Groovy脚本无法捕获evaluate加载的外部文件闭包抛出的自定义异常

问题根因

你遇到的捕获失败是类加载器隔离导致的:Groovy调用evaluate方法加载外部脚本时,默认会创建独立的类加载器加载脚本内定义的类。此时playMe.groovy中定义的PlayException,和rockMe.groovy中catch子句引用的PlayException虽然类名完全一致,但属于不同类加载器加载的两个独立类,JVM会判定类型不匹配,因此无法触发对应的异常分支。

解决方案(均不需要拆分自定义异常为独立类文件)

方案1:指定evaluate使用当前类加载器(最推荐)

调用evaluate时传入当前脚本的类加载器,让两个脚本的类由同一个加载器加载,即可让类型匹配正常捕获:
仅需要修改rockMe.groovy的evaluate行即可:

// 新增第二个参数指定用当前类加载器加载脚本内容
evaluate(new File("/path/to/folder", 'playMe.groovy'), this.class.classLoader)

void runMe() {
    try {
        play()
    } catch(PlayException e) {
        println("HURRA!!") // 此时可正常捕获
    }
}

runMe()

方案2:动态判断异常类型(改动最小)

如果不想调整evaluate的调用参数,可以先捕获父类Exception,再通过类名动态判断是否是目标自定义异常:

evaluate(new File("/path/to/folder", 'playMe.groovy'))

void runMe() {
    try {
        play()
    } catch(Exception e) {
        if (e.class.name == 'PlayException') {
            println("HURRA!!")
        } else {
            throw e // 非目标异常继续抛出
        }
    }
}

runMe()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:06:02