Когда вы ловите Exception
, вы поймаете любой RunnableException
и любой объявленный брошенный Exception
, но вы не поймаете ничего, что расширяет Error
. Если вы действительно хотите поймать любую вещь, то вам нужно поймать Throwable
.
Если вы хотите сделать это только для целей ведения журнала, и вам все равно, почему поток завершается, вы можете сделать это:
public void run() {
logger.debug("Starting thread " + Thread.currentThread());
try {
// The work of your Thread
} finally {
logger.debug("End of thread " + Thread.currentThread());
}
}
и оператор finally
гарантированно будет выполняться, если поток не остановлен, не заблокирован или каким-либо другим образом не прекратит выполнение без исключения.
В большинстве моих программ я устанавливаю UncaughtExceptionHandler , чтобы я знал о каждом потоке, который неожиданно умирает. Это была огромная помощь в отслеживании сбоев. Это было добавлено к языку с Java 5.