Разъяснение по обработке исключений - PullRequest
1 голос
/ 25 января 2011

Насколько я понимаю, когда выдается Exception, он будет пузыриться в стеке вызовов до тех пор, пока он не будет обработан (в пределах блока try / catch), и если этого никогда не произойдет, исключение в конечном итоге заходит так далеко, что достигает программы .Main () и, если он еще не обработан, во время выполнения считается «необработанным исключением».

Это правильно? Я искал высоко и низко и не могу найти информацию, которая согласна с этим? Есть какие-либо неточности в том, что я сказал?

Ответы [ 3 ]

7 голосов
/ 25 января 2011

Насколько я понимаю, когда выдается исключение, оно будет пузыриться в стеке вызовов до тех пор, пока оно не будет обработано (в пределах блока try / catch), и если этого никогда не произойдет, исключение в конечном итоге заходит так далеко, что достигает Program.Main. () и если среда все еще не обработана, среда выполнения считается «необработанным исключением».

Ваше описание, хотя и не является неточным само по себе, является чрезвычайно неполным; Вы не описываете, что происходит для случаев с:

  • наконец блоки
  • неисправные блоки
  • ловить блоки с фильтрами

Обратите внимание, что последние две функции CLR не предоставляются языком C #, но они все еще существуют.

Поток управления для этих трех случаев плюс обычные блоки захвата может быть довольно сложным.

Если вы хотите получить более полное представление о том, как это работает, я рекомендую внимательно и внимательно прочитать подробную статью Кристофера Брамма на эту тему:

http://blogs.msdn.com/b/cbrumme/archive/2003/10/01/51524.aspx

2 голосов
/ 26 января 2011

Насколько я понимаю, когда выдается исключение, оно будет пузыриться в стеке вызовов до тех пор, пока не будет обработано (в пределах блока try / catch), и если этого никогда не произойдет, исключение в конечном итоге заходит так далеко, что достигнетProgram.Main () и, если она еще не обработана, во время выполнения считается «необработанным исключением».

В дополнение к обработке исключения в блоке catch исключение не достигнет Program.Main() при следующих условиях (исключая такие вещи, как перебои в подаче электроэнергии и т. д.)

  • Если блок finally генерирует исключение, то исходное исключение больше не будет распространяться.
  • Если исключение выдается потоком, отличным от основного потока, оно станет «необработанным исключением», не достигнув Program.Main().(В более новых версиях среды выполнения .NET.)
2 голосов
/ 25 января 2011

Да, это правильно. И именно поэтому обработка исключений важна.

Что-то интересное для чтения об исключениях: http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...