Основные тезисы
1. Вы не можете добавить более одной анонимной (безымянной) ветки except
после названных.
:
# The code that always runs smoothly.
:
try:
:
# Risky code.
:
except Except_1:
# Crisis management takes place here.
except Except_2:
# We save the world here.
except:
# All other issues fall here.
:
# Back to normal.
:
2. Все предопределенные исключения Python образуют иерархию, т.е. некоторые из них являются более общими (BaseException
является наиболее общим), в то время как другие более или менее конкретны (например, IndexError
более конкретно, чем LookupError
).
Не следует помещать более конкретные исключения под более общими исключениями внутри той же последовательности ветвей except
. Например, Вы можете сделать так:
try:
# Risky code.
except IndexError:
# Taking care of mistreated lists
except LookupError:
# Dealing with other erroneous lookups
но не делайте так (если Вы не уверены, что хотите, чтобы какая-то часть вашего кода была бесполезной)
try:
# Risky code.
except LookupError:
# Dealing with erroneous lookups
except IndexError:
# You'll never get here
3. Оператор raise ExceptionName
может вызывать исключение по запросу. Тот же оператор, но без ExceptionName, может использоваться только внутри ветви try
и вызывает то же исключение, которое в настоящее время обрабатывается.
4. Оператор assert expression
оценивает expression и вызывает исключение AssertError
, когда expression равно нулю, пустой строке или None
. Вы можете использовать его для защиты некоторых критических частей вашего кода от разрушительных данных.
Упражнение 1
Каков ожидаемый вывод следующего кода?
try:
print(1/0)
except ZeroDivisionError:
print("zero")
except ArithmeticError:
print("arith")
except:
print("some")
Упражнение 2
Каков ожидаемый вывод следующего кода?
try:
print(1/0)
except ArithmeticError:
print("arith")
except ZeroDivisionError:
print("zero")
except:
print("some")
Упражнение 3
Каков ожидаемый вывод следующего кода?
def foo(x):
assert x
return 1/x
try:
print(foo(0))
except ZeroDivisionError:
print("zero")
except:
print("some")