Выбор ответа Middle Делегаты и события обновлено

Исключение в одном из подписчиков

Вопрос

У события три подписчика. Второй бросает исключение. Что будет при обычном вызове Changed?.Invoke(...)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Первый выполнится, исключение уйдёт вызывающему, третий не выполнится. Мультикаст-делегат вызывает методы последовательно в обычном цикле.

Варианты ответа

  1. Первый выполнится, исключение уйдёт вызывающему, третий не выполнитсяправильный ответ
  2. Все три выполнятся, исключение будет проглочено
  3. Выполнятся первый и третий, исключение попадёт в AggregateException
  4. Ни один не выполнится: делегат сначала проверяет всех подписчиков

Разбор

Мультикаст-делегат вызывает методы последовательно в обычном цикле. Исключение второго прерывает вызов, третий не получит событие, а исключение полетит в код, вызвавший событие. Ничего не собирается в AggregateException. Если нужна изоляция подписчиков, вызывают каждого из GetInvocationList() в своём try/catch.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме