Java: Исключение в дочернем потоке

Я думаю, лучше просто тестировать открытый интерфейс объекта. С точки зрения внешнего мира только поведение вопросов открытого интерфейса и это - то, к чему должны быть направлены Ваши модульные тесты.

, Как только у Вас есть некоторые твердые модульные тесты, записанные для объекта, Вы не хотите должными быть возвращаться и изменять те тесты просто потому что реализация позади измененного интерфейса. В этой ситуации Вы разрушили непротиворечивость своего поблочного тестирования.

5
задан user221327 30 November 2009 в 13:01
поделиться

3 ответа

Короткий ответ, это нет. Если исключение распространяется полностью из потока, оно просто умирает (возможно, генерируя некоторую ошибку на консоли).

Что вам может быть интересно сделать, так это перехватить все исключения в самом внешнем кадре стека ( т.е. ваш метод выполнения, который запустил поток), который помещает исключение в очередь или другой механизм связи (возможно, вместе с некоторыми метаданными, такими как идентификатор потока и т.д.) до того, как поток будет завершен. Затем очередь регулярно опрашивается родительским потоком (или используйте какой-либо другой механизм уведомления для пробуждения родительского потока, такой как ожидание / уведомление или объекты Condition).

6
ответ дан 13 December 2019 в 22:09
поделиться

Если никто явно не уведомляет поток, он не заметит. Возможно, UncaughtExceptionHandler поможет вам перехватить неперехваченные исключения. Дополнительно вам понадобится способ уведомить основной поток.
Это можно сделать, вызвав прерывание () или используя каналы, notify () / condition.await () и т. Д.

0
ответ дан 13 December 2019 в 22:09
поделиться

Вместо того чтобы окружать код потока блоком try / catch и информировать родительский поток, как уже объяснялось в предыдущих комментариях, вы можете переопределить UncaughtExceptionHandler . Механизм подробно описан здесь . Вы также можете посмотреть в документации Java Interface Thread.UncaughtExceptionHandler .

Я думаю, что это немного лучший способ, чем блок try / catch, поскольку механизм уведомления родительского потока отделен от потока код и может быть повторно использован для других потоков.

4
ответ дан 13 December 2019 в 22:09
поделиться
Другие вопросы по тегам:

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