1

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 的新手,所以可能会遗漏一些明显的东西。

4

1 回答 1

2

您可以添加一个关闭钩子,它会在程序退出时始终运行(如果可能):

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()

请注意,即使程序干净退出,shutdown 挂钩也会始终运行,因此如果您想尽早清理连接,则需要有一些方法来跟踪您已经运行了清理。

您还可以拥有任意数量的关闭挂钩,因此如果您有多个要清理的东西,则可以在函数内部使用它。

于 2012-05-26T06:28:58.797 回答