Шаг 148.
Основы языка Python.
Обработка исключений. Инструкция try...except...else...finally

    На этом шаге мы рассмотрим особенности использования этой инструкции.

    Для обработки исключений предназначена инструкция 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

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг