2014-10-24 2 views
-1

У меня есть try/catch блоков на более низких уровнях, чтобы обрабатывать большинство ошибок, но мне сказали, что нам нужна одна около вершины, в основном как уловка, чтобы программа продолжала работать правильно, если есть ошибка , Я положил try/catch(Exception e)/finally вокруг всего на верхнем уровне, но мы по-прежнему получаем исключения, вызывающие сбои. Я смотрел на трассировку стека для каких-либо подсказок ... Она начинается, как это (я могу отправить больше из него, если это поможет):Обработка ошибок на более высоком уровне

111858 [SimpleAsyncTaskExecutor-2] DEBUG o.h.e.jdbc.spi.SqlExceptionHelper - could not execute statement [n/a] java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("DATABASE"."TABLE"."COLUMN")

Странная вещь, что остальная часть трассировка стека никогда не возвращается к чему-то, что является нашим. Это все оракул/апач/спящий режим/springframework, пока не заканчивается:

at java.lang.Thread.run(Thread.java:795) [na:1.7.0]

Любые идеи, почему он не собирается обратно в наш код или как лучше реализовать это «поймать всех»? Блок finally для некоторых шагов, которые мы хотим реализовать, есть ли ошибка или нет.

Редактировать: для большей ясности и потому что, возможно, это поможет, это часть партии, которая обрабатывает файлы каждые 5 минут. Попытка/Загвоздка вот так:

try{ 
    //process file 
}catch(Exception e){ 
    //log exception 
}finally{ 
    //mark file as processed so it doesn't keep trying to reprocess a broken file 
} 
+0

Покажите нам какой-нибудь соответствующий код, пожалуйста, как на верхнем уровне попробуйте поймать – ToYonos

+0

@ToYonos Наверху try/catch уже существует. Это попытка {// делать вещи} catch (Exception e) {// log stuff} finally {// делать больше вещей} – Tajha

ответ

1

Вы, или библиотека, которую вы используете, должны быть нерест покинуть нить где-то и то, что поток, который бросает исключение.

Ваших вариантов

  1. выследить создание этого потока, и обработать исключение оттуда
  2. выследить какую нить группа что нить принадлежит и register an exception handler with that thread group
+0

Я не очень хорошо знаком с работой с группами потоков. Будет ли работать, если это библиотека, создающая новый поток? – Tajha

+0

Потенциально. Существует группа потоков по умолчанию, которая используется, но она будет зависеть от того, как был создан поток. Я боюсь, что в этом вопросе недостаточно подробностей, чтобы пригвоздить это к вам, я могу только предложить некоторую уверенность. Вы можете попросить Java распечатать список всех используемых потоков (см. Команду jstack или отправить сигнал kill -3 в java-процесс), и если это не включает их группы потоков, то класс Thread предоставляет что вам нужно написать, чтобы сделать это. Отладчик также очень полезен для проверки такой информации. –

0

Лучшим Идея, которую я могу предложить для реализации этого «поймать все», не делает этого.

Я бы, вместо этого, рекомендовал defensive programming на уровне класса. Каждый класс должен по возможности обрабатывать свои возможные исключения. Это сэкономит ваше время позже, когда что-то пойдет не так, и вам нужно отследить, откуда это произошло.

Вам нужно отлаживать и находить, где создается поток, и обрабатывать исключения там.

+0

Мы пытаемся запрограммировать оборону, но мы не можем думать обо всем. Это фактически пакет, который обрабатывает файлы. Идея состоит в том, что если есть проблема с файлом по какой-либо причине, о которой мы не думали, она будет отложена и не будет постоянно пытаться ее обработать. – Tajha

+0

Таким образом, разбивайте обработку файла на небольшие задачи. Если задача является опасной, попробуйте поймать ее. Существует такая вещь, как слишком много «попыток». – FunctionR

+0

Как это поможет, если исключение никогда не вернется к нашему коду? – Tajha

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