Одно из моих любимых мобов с поднятием событий на C# заключается в том, что исключение в обработчике событий приведет к поломке моего кода и, возможно, к запрету вызова других обработчиков, если сломанный один из них вызвал первый вызов; В большинстве случаев мой код не волновался, если кто-то другой код, который слушает его события, нарушен.Приостановка событий в C#, игнорирующих исключения, вызванные обработчиками
Я создал метод расширения, который перехватывает исключения:
public static void Raise(this EventHandler eh, object sender, EventArgs e)
{
if (eh == null)
return;
try
{
eh(sender, e);
}
catch { }
}
Хотя это не означает, мой код осуществляет независимо, этот метод не останавливает первый обработчик событий бросает исключение и предотвращение второго и последующих обработчиков, являющихся уведомление об этом событии. Я просматриваю способ итерации через GetInvocationList, чтобы обернуть каждый обработчик отдельных событий в свой собственный try/catch, но это кажется неэффективным, и я не уверен, что это лучший способ сделать это, или даже если я буду.
Кроме того, мне действительно неудобно просто игнорировать исключение здесь (и ни FxCop/Resharper ни на что); реалистично, что должно произойти с исключением в этом случае?
Я часто задавался вопросом, как лучше всего справиться с этим. – ChaosPandion
На самом деле возникает другой вопрос, который я задам отдельно; в этом вопросе я кодирую с точки зрения класса, поднимающего событие, но мне интересно, разрешено ли обработчикам событий бросать исключения в первую очередь. http://stackoverflow.com/questions/3114543/should-event-handlers-in-c-ever-raise-exceptions – Flynn1179