Я использую fork/join GPars. Когда я выбрасываю исключение после вызова forkOffChild, оно скрывается.
Например:
def myRecursiveClosure = { boolean top ->
try {
if (!top) {
throw new RuntimeException('child had a problem')
} else {
forkOffChild(false)
}
} catch (Exception exc) {
println 'Exception handled internally'
throw exc
}
}
try {
GParsPool.withPool {
GParsPool.runForkJoin(true, myRecursiveClosure)
}
} catch (Exception exc) {
println 'Exception handled externally'
throw exc
}
Здесь я устанавливаю флаг, чтобы знать, что замыкание было вызвано рекурсивно. Затем я выбрасываю исключение, которое перехватывается «внутри», но повторное выбрасывание никогда не перехватывается «извне». Поэтому я не знаю, что раздвоенный ребенок потерпел неудачу.
Я также пробовал обработчик исключений, но, похоже, он тоже не вызывается.
Это ожидаемое поведение или я делаю что-то не так? Есть ли какие-то стратегии, которые помогут в этом? Я не могу допустить, чтобы ребенок молча потерпел неудачу.
Спасибо!