Вам не нужен список «плохих» исключений, по умолчанию вы должны рассматривать все как плохие. Только поймать то, что вы можете справиться и восстановить. CLR может уведомлять вас о необработанных исключениях, чтобы вы могли соответствующим образом регистрировать их. Проглатывание всего, кроме перечисленных в черном списке исключений, не является правильным способом исправить ваши ошибки. Это бы просто замаскировало их. Прочитайте это и это .
Не исключать каких-либо особых исключений при ловле с целью
передачи исключений.
Вместо создания списков особых исключений в ваших предложениях catch,
вы должны ловить только те исключения, которые вы можете законно
справиться. Исключения, которые вы не можете обработать, не должны рассматриваться как
особые случаи в неспецифических обработчиках исключений.
В следующем примере кода демонстрируется некорректное тестирование на специальные
исключения в целях их повторного выброса.
public class BadExceptionHandlingExample2 {
public void DoWork() {
// Do some work that might throw exceptions.
}
public void MethodWithBadHandler() {
try {
DoWork();
} catch (Exception e) {
if (e is StackOverflowException ||
e is OutOfMemoryException)
throw;
// Handle the exception and
// continue executing.
}
}
}
Несколько других правил:
Избегайте обработки ошибок, перехватывая неконкретные исключения, такие как
System.Exception, System.SystemException и т. Д. В приложении
код. Есть случаи, когда обработка ошибок в приложениях
приемлемо, но такие случаи редки.
Приложение не должно обрабатывать исключения, которые могут привести к
неожиданное или эксплуатируемое состояние. Если вы не можете предсказать все возможные
причины исключения и убедитесь, что вредоносный код не может быть использован
результирующее состояние приложения, вы должны разрешить приложению
завершить вместо обработки исключения.
Подумайте об обнаружении конкретных исключений, когда поймете, почему это
будет выброшен в данном контексте.
Вы должны ловить только те исключения, которые вы можете восстановить. За
Например, FileNotFoundException, возникающая в результате попытки открыть
несуществующий файл может быть обработан приложением, потому что он может
сообщить о проблеме пользователю и позволить пользователю указать
другое имя файла или создать файл. Запрос на открытие файла, который
создает ExecutionEngineException не должны быть обработаны, потому что
причина исключения не может быть известна с какой-либо степенью
конечно, и приложение не может гарантировать, что это безопасно
продолжить выполнение.
Эрик Липперт классифицирует все исключения на 4 группы: Fatal, 'Boneheaded', Vexing, Exogenous. Вот мое толкование совета Эрика:
Exc. type | What to do | Example
------------|-------------------------------------|-------------------
Fatal | nothing, let CLR handle it | OutOfMemoryException
------------|-------------------------------------|-------------------
Boneheaded | fix the bug that caused exception | ArgumentNullException
------------|-------------------------------------|-------------------
Vexing | fix the bug that caused exception | FormatException from
| (by catching exception because | Guid constructor
| the framework provides no other way | (fixed in .NET 4.0
| way of handling). Open MS Connect | by Guid.TryParse)
| issue. |
------------|-------------------------------------|-------------------
Exogenous | handle exception programmatically | FileNotFoundException
Это примерно эквивалентно классификации Microsoft : использование, программная ошибка и системный сбой.
Вы также можете использовать инструменты статического анализа, такие как FxCop , чтобы обеспечить некоторые этих правил.