2012-05-25 18 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, так что не хватало некоторых очевидных вещей.

ответ

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

Смежные вопросы