Решать, какие исключения ловить в Python - PullRequest
7 голосов
/ 01 июня 2011

Предположим, что я использую библиотеку X, которая указывает, например, что exception.BaseError является базовым классом для всех исключений X.

Теперь есть еще одно исключение, скажем, X.FooError, которое, конечно, наследует от exception.BaseError, но более обобщенно, скажем, что оно обрабатывает неверный ввод. Предположим, есть много других таких классов, наследующих от BaseError, но все для обобщенных случаев.

 X
 |
BaseError
 |
FooError

Итак, я хочу проверить правильность ввода. Так какое исключение я должен поймать? Конечно, перехват каждого отдельного исключения невозможен, поэтому я ловлю X.BaseError и затем печатаю сообщение об ошибке. Или я могу поймать X.FooError специально, но тогда я пропускаю все другие случаи ошибок.

Это стандартный способ сделать это - поймать базовое исключение? Если да, то почему существуют другие исключения? Для обобщенного случая, когда мы хотим отловить конкретное исключение?

Ответы [ 3 ]

10 голосов
/ 01 июня 2011

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

try:
  X.foo()
except X.FooError:
  pass
except X.BaseError:
  pass
3 голосов
/ 01 июня 2011

Как обычно, есть хороший совет в PEP-8 , Руководстве по стилю для кода Python:

При отлове исключений упоминание специфично исключения всякий раз, когда это возможно вместо использования голого except: предложения.

Там гораздо больше, но я бессмысленно воспроизводить его здесь.

В этом случае я бы уловил особенности, если бы я обрабатывал их иначе, чем BaseError и BaseError для тех, которые требуют более общей обработки.Однако, я бы остановился на ловушке встроенного Exception.

2 голосов
/ 01 июня 2011

Вы ловите конкретное исключение, определяя его в предложении except, таким образом:

try:
    #do stuff
except X.FooError:
    # handle the error
except (X.AnotherError, x.YetAnotherError), exc:
    print 'I'm handling %s' % exc

Обратите внимание, что вы можете обрабатывать несколько классов исключений, перечислив их в кортеже.

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