Работаю с Enterprise Library, CAB и, в частности, с EventBroker уже почти год.
Всегда считал, что при работе с событиями через этот самый EventBroker происходит вызов подписчиков по порядку в цикле, причем если какой-то из подписчиков генерирует исключение, то EventBroker его перехватывает и вместо него кидает свое. Дескать, обработка события такого-то не прошла, получите и распишитесь.
Свойство InnerException оставалось нетронутым, то есть, равным null, что меня всегда раздражало: ну, получил, расписался, а в чем, собственно дело? Смысла в информации о том, что где-то сорвался какой-то из подписчиков не много, если не знаешь где и какой.
И вот сегодня для меня открылось сокральное знание великим методом "блин, щас посмотрю как это сделано и приделаю то, что мне нужно нафиг".
Оказывается, перебор подписчиков EventBroker действительно осуществляет в цикле и действительно перехватывает все исключения от всех подписчиков.
Но при этом он не прерывает цикл, а бережно складывает все полученные исключения в списочек и продолжает вызывать подписчиков.
После того, как подписчики кончились, он проверяет, а не пуст ли списочек исключений? Если он не пуст, то EventBroker действительно генерирует свое, новое (EventTopicException) исключение. Он действительно не заполняет свойство InnerException, так, как это просто не имеет смысла: если в списке находится более одного исключения, то какое выбрать в качестве InnerException?
Вместо этого класс EventTopicException имеет свойство Exceptions, которое содержит список всех исключений, произошедших во время обработки сообщения.
Вот так все просто. Примерно то, что хотел приделать к EventBroker'у я :)
Чувствую себя идиотом :)
P.S. Надо было писать этот пост с умным видом в тоне наставления, типа "для того, чтобы получить то-то надо посмотреть туда-то" :-) Опять стормозил ;)
Technorati tags:
EventBroker,
CAB,
.NET,
EL