Module (90%)
Section (100%)

Основные тезисы


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")