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

