Какие типы исключений не поймать?
Много раз упоминается только об исключениях, которые я могу обрабатывать (бросать, обертывать и/или регистрировать или выполнять некоторые другие действия).
Какие исключения не могут быть обработаны? Разве это то же самое значение, что и не быть пойманным? Я знаю, что исключения, которые могут представлять ссылку на объект как null, не должны быть пойманы, потому что они являются ошибками программирования, а не спровоцированы пользователем. Есть ли другой пример? Другой - ExecutionEngineException
.
Также, является ли курс действий в блоке catch всегда только между ретровом, wrap/rethrow и log? Есть ли когда-нибудь случай, когда в блоке catch нужно выполнить некоторые другие действия?
Спасибо
Ответы
Ответ 1
Используются обычные рекомендации, только поймите, что вы можете обработать. Там функция утилиты с именем IsCriticalException внутри фреймворка, которая довольно часто используется частями кода рамки для принятия решения о том, следует ли проглатывать исключение. Могло бы это пройти. Он считает следующее критическое:
- NullReferenceException
- StackOverflowException (несовместимый)
- OutOfMemoryException
- ThreadAbortException
- ExecutionEngineException (unatchable in 4.0)
- IndexOutOfRangeException
- AccessViolationException
Это хороший список.
Ответ 2
Я бы использовал совет Эрика Липперта и не улавливал "Фатальные" исключения:
http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx
Ответ 3
Курс действий в блоке catch может не всегда быть ретроном, обертыванием/поиском и журналом. Я видел, где исключение db, как тупик, вызывает исключение, а затем логика catch пытается снова выполнить действие базы данных в надежде, что заблокированный ресурс больше не заблокирован.