все 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Сообщить о неточности