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

プログラムが正常に終了した場合でも、シャットダウン フックは常に実行されることに注意してください。そのため、接続を早期にクリーンアップしたい場合は、クリーンアップを既に実行したことを追跡する何らかの方法が必要になります。

また、必要な数のシャットダウン フックを使用することもできるため、クリーンアップするものが複数ある場合は、関数内で使用できます。

于 2012-05-26T06:28:58.797 に答える