всегда пытаться перехватить вызовы внешних ресурсов?

StackOverflow https://stackoverflow.com/questions/233207

  •  04-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

Однако у вас может быть " try / finally " иметь дело с управлением ресурсами. Или даже чище, используя " блок, чтобы сделать то же самое.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top