все Python 3Исключенияконструкция
try / except
обработка
Блок try содержит код, который может вызвать исключение. except перехватывает его. else — если исключения не было. finally — всегда.
Синтаксис
try:
...
except ErrorType:
...
Ловите конкретный класс: except Exception, а тем более голый except:, заодно проглатывает опечатки вроде NameError и превращает баг в тихо работающую программу; голый except: захватывает ещё и BaseException, то есть KeyboardInterrupt с SystemExit. Порядок веток важен — срабатывает первая подходящая, поэтому except Exception перед except ValueError делает вторую ветку недостижимой. И держите тело try минимальным: чем больше строк под защитой, тем выше шанс перехватить не ту ошибку.
Примеры
try:
x = 1 / 0
except ZeroDivisionError:
print('division by zero') # → division by zero
try:
int('abc')
except ValueError as e:
print(e) # → invalid literal for int() with base 10: 'abc'
# Несколько except: срабатывает первый подходящий
try:
lst = [1, 2, 3]
print(lst[10])
except IndexError:
print('index error') # → index error
except Exception as e:
print('other:', e)
# else — если исключений не было
try:
result = 10 / 2
except ZeroDivisionError:
print('error')
else:
print(result) # → 5.0
# finally — выполняется всегда
try:
f = open('/nonexistent')
except FileNotFoundError:
print('not found') # → not found
finally:
print('always') # → always
# Несколько типов в одном except
try:
x = int(None)
except (TypeError, ValueError) as e:
print(type(e).__name__) # → TypeError
# Exception ловит всё, кроме SystemExit, KeyboardInterrupt и GeneratorExit
try:
raise RuntimeError('oops')
except Exception as e:
print(type(e).__name__, e) # → RuntimeError oops
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности