Какие типы исключений не поймать? - PullRequest
15 голосов
/ 01 апреля 2011

Часто упоминается только о тех исключениях, которые я могу обработать (бросить, обернуть и / или записать в журнал, или выполнить некоторые другие действия).

Какие исключения не могут быть обработаны? Это то же самое значение, которое не должно быть поймано? Я знаю, что исключения, которые могут представлять нулевую ссылку на объект, не должны быть перехвачены, потому что они являются ошибками программирования и не спровоцированы пользователем. Есть ли другой пример? Еще один ExecutionEngineException.

Кроме того, всегда ли последовательность действий в блоке catch между rethrow, wrap / rethrow и log? Был ли когда-нибудь случай, когда в блоке перехвата нужно выполнить какое-то другое действие?

Спасибо

Ответы [ 3 ]

15 голосов
/ 01 апреля 2011

Обычный совет применим, только поймать то, что вы можете справиться.Внутри фреймворка есть служебная функция с именем IsCriticalException, которая довольно часто используется частями кода фреймворка, чтобы решить, следует ли проглотить исключение.С таким же успехом.Он считает следующее критическим:

  • NullReferenceException
  • StackOverflowException (uncatchable)
  • OutOfMemoryException
  • ThreadAbortException
  • ExecutionEngineException (uncatchable in4.0)
  • IndexOutOfRangeException
  • AccessViolationException

Это хороший список.

12 голосов
/ 01 апреля 2011

Я бы воспользовался советом Эрика Липперта и не поймал бы «фатальные» исключения:

http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx

0 голосов
/ 01 апреля 2011

Ход действия в блоке перехвата не всегда может быть переброшен, перенесен / перемотан и записан.Я видел, как исключение db, например, взаимоблокировка, вызывает исключение, а затем логика catch пытается снова выполнить действие с базой данных в надежде, что заблокированный ресурс больше не заблокирован.

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