Я предпочитаю иметь логику обработки исключений далее в стеке вызовов около основного метода. Мне нравится этот подход... Однако я создал поток, где некоторые его вызовы метода в выполненном () могут выдать исключения. Я действительно хотел бы видеть, существует ли способ, которым эти исключения могут быть отброшены назад до родительского потока? Лучшее, о котором я мог думать, устанавливает переменную в объекте, который реализует Runnable
. Эта переменная является строкой, которая содержит сообщение об ошибке, которое затем использует загрузчик класса для корректного воссоздавания того же исключения в родительском потоке.
То, что я хотел бы знать, является там менее грязным способом получить то, что я хочу здесь? (чтобы смочь удостовериться, что любое исключение, добавленное дочерний поток, обработано с той же логикой обработки исключений, как будто это работало в основном повторном использовании потока/кода).
Поймайте его на внешнем уровне вашего метода run (), затем поместите исключение в переменную вашего Runnable и пусть ваш Runnable укажет, что он завершен.
Код, запустивший ваш runnable, должен затем проверить Runnable, чтобы увидеть, что объект «Exception» установлен, и либо повторно выбросить его, либо обработать.
Если вы бросите его повторно, вы можете заключить его в новое исключение:
throw new Exception(oldException);
Это даст вам обе трассировки стека.
(Спасибо, Тейлор Л.)
С помощью Thread.setUncaughtExceptionHandler () вы можете установить Thread.UncaughtExceptionHandler в своем Thread
и имеют централизованную логику обработки исключений ваших потоков.
Кроме того, вы можете написать свой собственный ThreadFactory , который будет создавать ваши потоки с предустановленным Thread.UncaughtExceptionHandler
.
Здесь можно использовать ExecutorService, чтобы отправить вызываемый объект и получить Future. В тот момент, когда вы, по крайней мере, хотите, чтобы исключение распространялось на вызывающий поток, вы должны вызвать future.get ()
future.get () будет распространять любое исключение, созданное в методе вызова, в поток который вызывает future.get (). Поэтому, если ваш основной поток вызывает future.get (), тогда основной поток будет видеть любые выброшенные исключения.