Ответ 1
Вам не нужен список "плохих" исключений, вы должны относиться ко всему так же плохо по умолчанию. Только поймите, с чем вы можете справиться и восстановиться. CLR может уведомлять о необработанных исключениях, чтобы вы может вести их надлежащим образом. Проглатывание всего, кроме черных перечисленных исключений, не является правильным способом исправить ошибки. Это просто замаскировало их. Прочитайте this и this.
Не исключайте особых исключений при ловле с целью передачи исключений.
Вместо создания списков специальных исключений в ваших предложениях 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, чтобы обеспечить некоторые из этих правила.