На этом шаге мы рассмотрим особенности использования этой инструкции.
Для обработки исключений предназначена инструкция try. Формат инструкции:
try: <Блок, в котором перехватываются исключения> [except [<Исключение1>[ as <Объект исключения>]] : <Блок, выполняемый при возникновении исключения> [... except [ <ИсключениеN> [ as <Объект исключения>] ] : <Блок, выполняемый при возникновении исключения>]] [else: <Блок, выполняемый, если исключение не возникло>] [finally: <Блок, выполняемый в любом случае>]
Инструкции, в которых перехватываются исключения, должны быть расположены внутри блока try. В блоке except в параметре <Исключение1> указывается класс обрабатываемого исключения. Например, обработать исключение, возникающее при делении на ноль, можно так, как показано ниже:
try: # Перехватываем исключения х = 1 / 0 # Ошибка: деление на 0 except ZeroDivisionError: # Указываем класс исключения print("Обработали деление на 0") х = 0 print(х) # Выведет: 0
Результат работы приложения:
Обработали деление на 0
0
Если в блоке try возникло исключение, то управление передается блоку except. В случае, если исключение не соответствует указанному классу, управление передается следующему блоку except. Если ни один блок except не соответствует исключению, то исключение "всплывает" к обработчику более высокого уровня. Если исключение в программе вообще нигде не обрабатывается, оно передается обработчику по умолчанию, который останавливает выполнение программы и выводит стандартную информацию об ошибке. Таким образом, в обработчике может быть несколько блоков except с разными классами исключений. Кроме того, один обработчик можно вложить в другой:
try: # Обрабатываем исключения try: # Вложенный обработчик х = 1 / 0 # Ошибка: деление на 0 except NameError: print("Неопределенный идентификатор") except IndexError: print("Несуществующий индекс") print("Выражение после вложенного обработчика") except ZeroDivisionError: print("Обработали деление на 0") х = 0 print(х) # Выведет: 0
Результат работы приложения:
Обработали деление на 0
0
В этом примере во вложенном обработчике не указано исключение ZeroDivisionError, поэтому исключение "всплывает" к обработчику более высокого уровня.
После обработки исключения управление передается инструкции, расположенной сразу после обработчика. В нашем примере управление будет передано инструкции, выводящей значение переменной х: (print (x)). Обратите внимание на то, что инструкция print ("Выражение после вложенного обработчика") выполнена не будет.
В инструкции except можно указать сразу несколько исключений, перечислив их через запятую внутри круглых скобок:
try: х = 1 / 0 except (NameError, IndexError, ZeroDivisionError): # Обработка сразу нескольких исключений х = 0 print(х) # Выведет: 0
Результат работы приложения:
0
Получить информацию об обрабатываемом исключении можно через второй параметр в инструкции except:
try: х = 1 / 0 except (NameError, IndexError, ZeroDivisionError) as err: print (err.__class__.__name__) # Название класса исключения print(err) # Текст сообщения об ошибке
Результат работы приложения:
ZeroDivisionError
division by zero
На следующем шаге мы закончим изучение этого вопроса.