всегда пытаться ловить вызовы внешних ресурсов? - PullRequest
8 голосов
/ 24 октября 2008

Должен ли я всегда заключать вызовы внешних ресурсов в try-catch? (т. е. вызовы базы данных или файловой системы). Есть ли лучший способ обработки ошибок при вызове внешних ресурсов?

Ответы [ 6 ]

7 голосов
/ 24 октября 2008

Catch только исключения , с которыми вы можете справиться . Например, при использовании внешних ресурсов рекомендуется отлавливать определенных исключений, которые, как вы знаете, могут обрабатываться. В случае файлов это может быть (IOException, SecurityException и т. Д.), В случае базы данных исключением может быть SqlException или другие.

В любом случае, не перехватывает исключений, которые вы не обрабатываете , позволяйте им перетекать в верхний слой, который может. Или, если по какой-то причине вы перехватываете исключения, но не обрабатываете их, перебросьте их, используя throw; (что создаст операцию IL перебрасывания, а не trow).

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

3 голосов
/ 24 октября 2008

Я думаю, что есть три причины для блока catch:

  • Вы можете обработать исключение и восстановить (из кода «низкого уровня»)
  • Вы хотите переписать исключение (опять же, из кода "низкого уровня")
  • Вы находитесь на вершине стека, и хотя вы не можете восстановить саму операцию, вы не хотите, чтобы все приложение не работало

Если вы придерживаетесь этих правил, у вас должно быть очень мало блоков catch по сравнению с блоками try/finally - и эти блоки try/finally почти всегда просто вызывают Dispose и поэтому лучше всего записываются как операторы using.

Итог: очень важно иметь блок finally для освобождения ресурсов, но блоки catch обычно должны быть реже.

2 голосов
/ 24 октября 2008

У Эрика Липперта есть хороший блог на эту тему, здесь .

Нет смысла (кроме «досадных» (см. Блог)) ловить исключение, если вы не можете сделать что-то полезное; и в большинстве случаев вы просто не можете - так что пусть это всплывает (ваш пользовательский интерфейс должен что-то очищать и отображать).

Однако вы можете попытаться решить, как управлять ресурсами. Или даже чище, блок «с помощью», чтобы сделать то же самое.

0 голосов
/ 24 октября 2008

это всегда зависит от того, чего ты хочешь достичь. Сервер, который не отвечает, может быть достаточно серьезным, чтобы остановить все, что делает рутина, и исключение должно быть выдано вызывающей стороне.

В других случаях вас не волнует, не удалось обновить БД или нет. Тогда использование исключения в порядке.

Очевидно, что вы не хотите показывать трассировку стека конечному пользователю, поэтому вам нужно где-то его перехватить.

0 голосов
/ 24 октября 2008

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

...