Чтобы исключить распространение исключения в обработчике на генератор событий, ответ состоит в том, чтобы вручную вызывать каждый элемент в делегате MultiCast (то есть обработчике события) внутри try-catch
Будут вызваны все обработчики, и исключение не будет распространено.
public EventHandler<EventArgs> SomeEvent;
protected void OnSomeEvent(EventArgs args)
{
var handler = SomeEvent;
if (handler != null)
{
foreach (EventHandler<EventArgs> item in handler.GetInvocationList())
{
try
{
item(this, args);
}
catch (Exception e)
{
// handle / report / ignore exception
}
}
}
}
Осталось вам реализовать логику того, что делать, когда один или несколько получателей события бросают, а другие нет. Функция catch () также может перехватывать определенное исключение и откатывать любые изменения, если это имеет смысл, позволяя получателю события сигнализировать источнику события о возникновении исключительной ситуации.
Как отмечают другие, использование исключений в качестве потока управления не рекомендуется. Если это действительно исключительное обстоятельство, то обязательно используйте исключение. Если вы получаете много исключений, вы, вероятно, захотите использовать что-то еще.