Комментарии 10
Вы patterns & practices (http://msdn.microsoft.com/ru-ru/library/ff953192(v=PandP.50).aspx) не читали?
А разве уже .Net Framework 4.5 на дворе? Вики утверждает, что последняя версия 4.0.
Скоро будет 4.5, сейчас в стадии Preview, о чем говорит и Вики.
Что значит скоро? Она уже давно доступен внутри Visual Studio 2011 Developer Preview
А чем вызвано отсутствие регенерации исключений?
Сперва не поверил ряду высказываний (про первые листинги). Потом проверил Ваши примеры. Посмотрел результат компиляции ILDasm'ом. Чуть не заплакал, когда увидел Activator.CreateInstance().
Немного расстроился оборачиванию исключений в TargetInvocationException и TypeInitializationException, но после просмотра IL и объяснений из статьи, понимаю, почему так. Но всё равно, грустно это всё. Жаль, что местами C# не следует принципу наименьшего удивления.
Немного расстроился оборачиванию исключений в TargetInvocationException и TypeInitializationException, но после просмотра IL и объяснений из статьи, понимаю, почему так. Но всё равно, грустно это всё. Жаль, что местами C# не следует принципу наименьшего удивления.
catch (AggregateException e)
{
ExceptionDispatchInfo di = ExceptionDispatchInfo.Capture(e.InnerException);
di.Throw();
return default(T);
}
Увидел такой код до того как прочитал статью, и внутри что-то ёкнуло :) Как мне кажется, вместо return default(T); лучше написать throw;
Хотя код не выполняется, но с throw как-то привычнее выглядит.
{
ExceptionDispatchInfo di = ExceptionDispatchInfo.Capture(e.InnerException);
di.Throw();
return default(T);
}
Увидел такой код до того как прочитал статью, и внутри что-то ёкнуло :) Как мне кажется, вместо return default(T); лучше написать throw;
Хотя код не выполняется, но с throw как-то привычнее выглядит.
Отличная статья, спасибо!
Есть правда одна неточность здесь:
Особенность платформы .NET заключается в том, что в ней не существует (а точнее, как мы вскоре увидим – не существовало) способа перехвата исключения в одном месте и последующего его генерирования в другом.
На самом деле он в некотором роде существует. Взять тот же ThreadAbortException, который на первый взгляд не перехватывается catch. На самом деле он перехватывается, и снова генерируется в конце блока catch. И может быть погашен только с помощью Thread.ResetAbort().
Что интересно, так это то, что делается это не на уровне CIL, а как-то иначе.
Есть правда одна неточность здесь:
Особенность платформы .NET заключается в том, что в ней не существует (а точнее, как мы вскоре увидим – не существовало) способа перехвата исключения в одном месте и последующего его генерирования в другом.
На самом деле он в некотором роде существует. Взять тот же ThreadAbortException, который на первый взгляд не перехватывается catch. На самом деле он перехватывается, и снова генерируется в конце блока catch. И может быть погашен только с помощью Thread.ResetAbort().
Что интересно, так это то, что делается это не на уровне CIL, а как-то иначе.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Повторная генерация исключений