Как написать безопасный код: проверка состояния и обработка исключений? - PullRequest
3 голосов
/ 13 июля 2010

Условная проверка:

if denominator == 0:
    // do something like informing the user, or skipping this iteration.
else:
    result = numerator/denominator

if FileExists('path/to/file'):
    // open file read & write.
else:
    // do something like informing the user, or skipping this iteration.

Обработка исключений:

try:
    result = numerator/denominator
catch (DevidedByZeroException):
    //take action

try:
    //open file read & write.
catch (FileNotExistsException):
    //take action

Я часто сталкиваюсь с такими ситуациями. Какой пойти? Почему?

Ответы [ 3 ]

5 голосов
/ 13 июля 2010

Как всегда, это зависит.

На мой взгляд, исключения должны быть исключительными.

Если вы обычно ожидаете, что что-то может не сработать, вам следует выполнить условные проверки. Код условной проверки выполняется постоянно, независимо от того, есть ли проблема, поэтому проверки не должны занимать много времени.

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

У меня был случай, когда я хотел записать файл на сетевой диск, код для проверки наличия общего ресурса UNC может занять до 30 секунд, поэтому вы хотите использовать исключения здесь!

1 голос
/ 14 июля 2010

В первом примере вполне возможно, что файл может быть удален между проверкой и открытием, так что вы все равно можете получить исключение FileNotExistsException.В сообществе Python это называется дебатами LBYL (смотри, прежде чем ты прыгнешь) против EAFP (проще просить прощения, чем разрешения), и Pythonic согласен, что EAFP в целом лучше.

1 голос
/ 13 июля 2010

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

И во многих случаях ваша инструкция не выдает исключение, когда что-то идет не так, как надоиспользуйте условие для его обнаружения, вы можете делать это без перехвата исключений или использовать его в блоке try с throw good instance of expeption class.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...