Python: как избежать дублирования кода при отлове исключений? - PullRequest
9 голосов
/ 10 октября 2011

Что такое хороший шаблон, чтобы избежать дублирования кода при работе с различными типами исключений в Python, например.Я хочу обработать URLError и HTTPError simlar, но не совсем:

try:
    page = urlopen(request)
except URLError, err:
    logger.error("An error ocurred %s", err)
except HTTPError, err:
    logger.error("An error occured %s", err)
    logger.error("Error message: %s", err.read())

В этом примере я хотел бы избежать дублирования первого вызова logger.error.Учитывая, что URLError является родителем HTTPError, можно сделать что-то вроде этого:

except URLError, err:
    logger.error("An error occurred %s", err)
    try:
         raise err
    except HTTPError, err:
         # specialization for http errors
         logger.error("Error message: %s", err.read())
    except:
        pass

Другим подходом может быть использование isinstance, например.если бы URLError и HTTPError не были в цепочке наследования:

except (URLError, HTTPError), err:
    logger.error("An error occured %s", err)
    if isinstance(err, HTTPError):
         logger.error("Error message: %s", err.read())

Какой из них мне лучше выбрать, есть ли другой лучший подход?

1 Ответ

10 голосов
/ 10 октября 2011

Я думаю, что ваш третий пример - лучшее решение.

  • Это самая короткая версия
  • избегает дублирования
  • Он понятен и легок для понимания, в отличие от второй версии.

Возможно, вы захотите использовать более новый синтаксис except FooError as err, если вы используете Python 2.6 или выше.

Также, в вашем примере, первая версия не совсем корректна, так как обработчик URLError уже перехватывает HTTPError, поэтому часть except HTTPError никогда не достигается. Вы должны переключить два except вокруг. Еще одна причина не использовать это.

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