Groovy脚本中的主线程异常处理程序

时间:2012-05-25 08:36:17

标签: exception-handling groovy

遇到Groovy的问题,如果在脚本中抛出未捕获的异常,我需要在退出之前进行一些清理,但是找不到办法来做到这一点。

我已经尝试了 Thread.setDefaultUncaughtExceptionHandler ,但似乎它不适用于主线程。然后,我看了一下堆栈跟踪,它引导我到GroovyStarter,在那里我发现了一段很好的代码,这意味着 Thread.setDefaultUncaughtExceptionHandler 实际上不应该工作:

public static void main(String args[]) {
   try {
       rootLoader(args);
   } catch (Throwable t) {
       t.printStackTrace();
   }
}

仅仅为了示例,这里是我想要存档的内容(这不是可运行的脚本,只是为了显示概念):

def process = new ProcessBuilder(command).redirectErrorStream(true).start();

onException = {
    process.destroy()
}

请不要建议使用try / catch,这是我能想到的事情:)

PS:我是Groovy的新手,所以可能会遗漏一些明显的东西。

1 个答案:

答案 0 :(得分:2)

你可以add a shutdown hook,它会在程序退出时始终运行(如果可能):

def process = new ProcessBuilder(command).redirectErrorStream(true)

boolean success = false

def cleanup = {
    success = true
    process.destroy()
}

addShutdownHook {
    if(!success && process) {
        cleanup()
    }
}

process.start()
// alternatively, always rely on the shutdown hook
cleanup()

请注意,即使程序完全退出,关闭挂钩始终也会运行,因此如果您想要及早清理连接,则需要有一些跟踪方式来运行清理工作

你也可以拥有任意数量的关闭钩子,所以如果你要清理多件事,可以在函数内部使用它。