Обработка исключений и бросание - это то, что я вижу, неправильно понимаемое все время, большинством разработчиков, с которыми я работал.
- Исключения позволяют находить ошибки в коде.
- Они останавливают запущенную программу, чтобы предотвратить «травму» для бизнеса.
- Они позволяют фильтровать между разумно ожидаемыми исключениями (сеть недоступна в мобильном приложении) по сравнению с непредвиденными ошибками, такими как исключение NullReferenceException.
- Они прямо соображают, почему произошла ошибка.
- Они позволяют каждому компоненту добавлять слой информации о контексте и состоянии, чтобы помочь отлаживать, это шаблон catch, wrap и throw.
Вы можете и должны использовать попытаться/поймать/(наконец) почти везде, но ...
используется улов только тогда, когда вы знаете, какие исключения (ы), которые могут произойти и может восстановиться их. Вы редко должны когда-либо ловить базовый тип исключения. Разрешить все другие ошибки пузыриться и быть найдены программистом/тестером/пользователем.
Возможно, вы захотите поймать базовый тип исключения, если вы собираетесь выбросить другое исключение и приложить исходное исключение как исключение InnerException.
Вы не должны думать дважды или лениться о создании собственных типов исключений. Например, вы можете написать исключение DataAccessException и выбросить его с исключениями, попавшими в уровень, прикрепленный в InnerException. Таким образом, ваш журнал регистрирует тип исключения, который более точно показывает, где произошла ошибка, и вызывающий код может выбирать только для обнаружения исключения DataAccessException и выполнения повторной попытки или чего-то еще.
Вы также можете рассмотреть возможность абстрактного абзаца и подклассификации DataAccessException для более конкретных исключений, таких как SqlDataAccessException или SecurityDataAccessException.
Как вы, кажется, знаете, вы используете, наконец, когда хотите, чтобы какой-то код запускался в случае ошибки, даже если вы не поймаете и не обработаете само исключение. В ситуациях, когда вы должны всегда выпускать ресурс, try/finally становится стандартным шаблоном.
Кроме того, если возможно, поместите try/catch вокруг наиболее конкретного патча кода, в котором вы можете справиться с ошибкой, чтобы ошибки кодирования в окружающем коде разбивали приложение.
Вы можете подумать: «Как я могу поймать конкретное исключение, если я еще не знаю, какие исключения будут выбрасываться?» Вы должны увидеть их документированными в методе ExecuteNonSql, и поэтому важно документировать свой собственный API/компонент за исключения, которые он выбрасывает. Используйте XML-комментарии для этого, и если вы отправляете публичную DLL, включите генератор файлов комментариев XML.
Это может показаться чем-то большим, но на практике это не так. Когда вы инвестируете в ведение журнала и правильную обработку/мета-обработку исключений, вы сможете разрешить ошибки в считанные минуты, вы будете чувствовать себя чемпионом, и вскоре вы научитесь расстраиваться из-за плохого кода других людей :)
На этот этап в вашей жизни программирования, я настоятельно рекомендую прочитать Принципы проектирования каркаса от Cwalina и Abrams.Это поможет вам быстро сделать правильный выбор по всем этим типам вопросов, и вы обнаружите, что использование вашего собственного кода так же радует, как и API-интерфейсы Microsoft (в основном).
Luke
Немного о сообщениях. Я использую такие вещи в сообщении об ошибке.
«Невозможно выполнить {выполнить функцию}. Произошел {тип исключения}. {Предлагайте рекомендацию по устранению или общие причины ошибки}. См. {Внутреннее исключение | дальнейшие записи в журнале}."
Например, в качестве компонента для состояния автоматического энергосбережения в приложении:
...
catch(FileNotFoundException fnfe)
{
string m = String.Format("Cannot save changes. A FileNotFoundException occurred. Check the path '{0}' is valid, that your network is up, and any removable media is available. Please see inner exception.", path);
_log.Error(m, fnfe);
throw new StorageLifecycleException(m, fnfe);
}
так могли бы вы разработать, используя мой код? Я не использовал в 3-м ярусе – Gaurav
+1 В сообщении об ошибке. Мы все росли с грубыми сообщениями, поэтому мы думаем, что сообщения должны звучать глупо. Нет. Они должны звучать как друг, объясняющий проблему простым языком, даже предлагая возможные решения. –