Карточка Senior Исключения обновлено
ExceptionDispatchInfo
Вопрос
Как перебросить пойманное исключение в другом месте или потоке, не потеряв исходный стек?
Попробуйте сами
Ответьте про себя или вслух, потом откройте ответ и сверьтесь.
Показать ответ и разбор
Коротко
Стек будет содержать и исходное место, и место повторного броска.
Ответ
ExceptionDispatchInfo captured = null;
try { Work(); }
catch (Exception e) { captured = ExceptionDispatchInfo.Capture(e); }
// позже, в другом месте
captured?.Throw();
Стек будет содержать и исходное место, и место повторного броска.
Разбор
Так устроен await: исключение из задачи пробрасывается через ExceptionDispatchInfo, поэтому стек после await указывает на реальное место ошибки.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.