2012-05-25 2 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() 
} 

/캐치하려고 사용하는 것이 좋습니다하지 마십시오 :) : 여기 예제의 난 (단지 개념을 보여주기 위해,이 실행 가능한 스크립트 없음) 보관할 것입니다

P S : 저는 Groovy의 초보자입니다. 그래서 명백한 것들을 놓칠 수 있습니다. 당신이 필요하므로 항상 종료 훅 이 실행되는 프로그램이 정상적으로 종료 되더라도 것을

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

참고 :

답변

2

당신은 프로그램이 종료 할 때 항상 (가능한 경우) 실행되는, add a shutdown hook 수 일찍 연결을 정리하려면 이미 정리를 실행했는지 추적 할 수있는 방법이 있습니다.

종료 훅을 원하는만큼 가질 수 있으므로 정리할 항목이 여러 개있는 경우 함수 내에서 사용할 수 있습니다.

+0

이것은 나를 위해 작동합니다. 고맙습니다! – Stas