2011-01-25 5 views
1

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

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

ответ

7

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

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

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

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

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

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

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

2

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

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

+0

Какие-либо ссылки, которыми вы владеете, руководствуясь этой информацией? –

+0

Лучший источник, который я знаю, - это спецификация CLI. Немного сух, чтобы читать. http://www.ecma-international.org/publications/standards/Ecma-335.htm – Botz3000

+2

Это неверно. Это * не * почему важна обработка исключений. Вы не должны обрабатывать исключения, о которых вы ничего не можете сделать. И большую часть времени, если вы можете что-то сделать об исключении, это указывает на то, что вы используете его для управления потоком, чего вы не должны делать в первую очередь. Исключения должны быть зарезервированы для действительно исключительных условий, которые вы, вероятно, не сможете обработать, и * должны * пузыриться даже при сбое программы, если это необходимо. –

2

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

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

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