Python Glossary English

все Python 3Исключенияпонятие

Иерархия исключений

иерархия

Встроенные исключения образуют иерархию. BaseException → Exception → стандартные исключения.

Синтаксис

BaseException
  SystemExit, KeyboardInterrupt
  Exception
    ValueError, TypeError, IndexError...

Ловите конкретный класс, а не Exception: широкий обработчик молча проглатывает опечатки в вашем же коде. SystemExit, KeyboardInterrupt и GeneratorExit наследуются прямо от BaseException намеренно — под except Exception они не попадают, зато голый except: их перехватит и сломает выход по Ctrl+C. Блоки except проверяются сверху вниз, поэтому потомка (IndexError) пишут раньше предка (LookupError), иначе он не сработает никогда.

Примеры

print([c.__name__ for c in ZeroDivisionError.__mro__])
# → ['ZeroDivisionError', 'ArithmeticError', 'Exception', 'BaseException', 'object']
print(issubclass(KeyError, LookupError))  # → True
print(issubclass(KeyboardInterrupt, Exception))  # → False
# Базовый класс ловит всех наследников
for action in (lambda: [1, 2][5], lambda: {}['missing']):
    try:
        action()
    except LookupError as e:
        print(type(e).__name__)  # → IndexError, затем KeyError
for bad in (lambda: int('abc'), lambda: 'str' + 1, lambda: None.attr):
    try:
        bad()
    except Exception as e:
        print(type(e).__name__)  # → ValueError / TypeError / AttributeError

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности