2012-05-25 61 views
1

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語句,這東西我能想到自己的:)

P S:我是Groovy的新手,所以可能會漏掉一些明顯的東西。

回答

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

注意,關閉掛鉤總是運行,即使程序退出乾淨,所以你需要如果您想盡早清理連接,可以使用某種方式跟蹤您執行清理操作。

您也可以根據需要擁有儘可能多的關閉掛鉤,因此如果您有多個要清理的內容,則可以在函數內部使用這些關閉掛鉤。

+0

這對我很有用。謝謝! – Stas