Java: Обрабатывание исключений в дочерних потоках

Я предпочитаю иметь логику обработки исключений далее в стеке вызовов около основного метода. Мне нравится этот подход... Однако я создал поток, где некоторые его вызовы метода в выполненном () могут выдать исключения. Я действительно хотел бы видеть, существует ли способ, которым эти исключения могут быть отброшены назад до родительского потока? Лучшее, о котором я мог думать, устанавливает переменную в объекте, который реализует Runnable. Эта переменная является строкой, которая содержит сообщение об ошибке, которое затем использует загрузчик класса для корректного воссоздавания того же исключения в родительском потоке.

То, что я хотел бы знать, является там менее грязным способом получить то, что я хочу здесь? (чтобы смочь удостовериться, что любое исключение, добавленное дочерний поток, обработано с той же логикой обработки исключений, как будто это работало в основном повторном использовании потока/кода).

10
задан Zombies 13 April 2010 в 17:37
поделиться

3 ответа

Поймайте его на внешнем уровне вашего метода run (), затем поместите исключение в переменную вашего Runnable и пусть ваш Runnable укажет, что он завершен.

Код, запустивший ваш runnable, должен затем проверить Runnable, чтобы увидеть, что объект «Exception» установлен, и либо повторно выбросить его, либо обработать.

Если вы бросите его повторно, вы можете заключить его в новое исключение:

throw new Exception(oldException);

Это даст вам обе трассировки стека.

(Спасибо, Тейлор Л.)

3
ответ дан 3 December 2019 в 14:33
поделиться

С помощью Thread.setUncaughtExceptionHandler () вы можете установить Thread.UncaughtExceptionHandler в своем Thread и имеют централизованную логику обработки исключений ваших потоков.

Кроме того, вы можете написать свой собственный ThreadFactory , который будет создавать ваши потоки с предустановленным Thread.UncaughtExceptionHandler .

4
ответ дан 3 December 2019 в 14:33
поделиться

Здесь можно использовать ExecutorService, чтобы отправить вызываемый объект и получить Future. В тот момент, когда вы, по крайней мере, хотите, чтобы исключение распространялось на вызывающий поток, вы должны вызвать future.get ()

future.get () будет распространять любое исключение, созданное в методе вызова, в поток который вызывает future.get (). Поэтому, если ваш основной поток вызывает future.get (), тогда основной поток будет видеть любые выброшенные исключения.

26
ответ дан 3 December 2019 в 14:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: