Карточка Senior Исключения обновлено

ExceptionDispatchInfo

Вопрос

Как перебросить пойманное исключение в другом месте или потоке, не потеряв исходный стек?

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

Ответьте про себя или вслух, потом откройте ответ и сверьтесь.

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

Коротко

Стек будет содержать и исходное место, и место повторного броска.

Ответ

ExceptionDispatchInfo captured = null;
try { Work(); }
catch (Exception e) { captured = ExceptionDispatchInfo.Capture(e); }
// позже, в другом месте
captured?.Throw();

Стек будет содержать и исходное место, и место повторного броска.

Разбор

Так устроен await: исключение из задачи пробрасывается через ExceptionDispatchInfo, поэтому стек после await указывает на реальное место ошибки.

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

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