Найти тему
Удалёнка

Python. except и обработка разных типов исключений

Оглавление

Встроенные типы исключений

В примере выше обрабатывались сразу все исключения, которые могут возникнуть в коде. Однако мы можем конкретизировать тип обрабатываемого исключения, указав его после слова except:

try:

number = int(input("Введите число: "))

print("Введенное число:", number)

except ValueError:

print("Преобразование прошло неудачно")

print("Завершение программы")

В данном случае блок execpt обрабатывает только исключения типа ValueError, которые могут возникнут при неудачном преобразовании строки в число.

В Python есть следующие базовые типы исключений:

  • BaseException: базовый тип для всех встроенных исключений
  • Exception: базовый тип, который обычно применяется для создания своих типов исключений
  • ArithmeticError: базовый тип для исключений, связанных с арифметическими операциями (OverflowError, ZeroDivisionError, FloatingPointError).
  • BufferError: тип исключения, которое возникает при невозможности выполнить операцию с буффером
  • LookupError: базовый тип для исключений, которое возникают при обращении в коллекциях по некорректному ключу или индексу (например, IndexError, KeyError)

От этих классов наследуются все конкретные типы исключений. В Python обладает довольно большим списком встроенных исключений. Весь этот список можно посмотреть в документации. Перечислю только некоторые наиболее часто встречающиеся:

  • IndexError: исключение возникает, если индекс при обращении к элементу коллекции находится вне допустимого диапазона
  • KeyError: возникает, если в словаре отсутствует ключ, по которому происходит обращение к элементу словаря.
  • OverflowError: возникает, если результат арифметической операции не может быть представлен текущим числовым типом (обычно типом float).
  • RecursionError: возникает, если превышена допустимая глубина рекурсии.
  • TypeError: возникает, если операция или функция применяется к значению недопустимого типа.
  • ValueError: возникает, если операция или функция получают объект корректного типа с некорректным значением.
  • ZeroDivisionError: возникает при делении на ноль.
  • NotImplementedError: тип исключения для указания, что какие-то методы класса не реализованы
  • ModuleNotFoundError: возникает при при невозможности найти модуль при его импорте директивой import
  • OSError: тип исключений, которые генерируются при возникновении ошибок системы (например, невозможно найти файл, память диска заполнена и т.д.)

И если ситуация такова, что в программе могут быть сгенерированы различные типы исключений, то мы можем их обработать по отдельности, используя дополнительные выражения except. И при возникновении исключения Python будет искать нужный блок except, который обрабатывает данный тип исключения:

try:

number1 = int(input("Введите первое число: "))

number2 = int(input("Введите второе число: "))

print("Результат деления:", number1/number2)

except ValueError:

print("Преобразование прошло неудачно")

except ZeroDivisionError:

print("Попытка деления числа на ноль")

except BaseException:

print("Общее исключение")

print("Завершение программы")

Если возникнет исключение в результате преобразования строки в число, то оно будет обработано блоком except ValueError. Если же второе число будет равно нулю, то есть будет деление на ноль, тогда возникнет исключение ZeroDivisionError, и оно будет обработано блоком except ZeroDivisionError.

Тип BaseException представляет общее исключение, под которое попадают все исключительные ситуации. Поэтому в данном случае любое исключение, которое не представляет тип ValueError или ZeroDivisionError, будет обработано в блоке except BaseException:.

Однако, если в программе возникает исключение типа, для которого нет соответствующего блока except, то программа не сможет найти соответствующий блок except и сгенерирует исключение. Например, в следующем случае:

try:

number1 = int(input("Введите первое число: "))

number2 = int(input("Введите второе число: "))

print("Результат деления:", number1/number2)

except ZeroDivisionError:

print("Попытка деления числа на ноль")

print("Завершение программы")

Здесь предусмотрена обработка деления на ноль с помощью блока except ZeroDivisionError. Однако если пользователь вместо числа введет некорвертиуремую в число в строку, то возникнет исключение типа ValueError, для которого нет соответствующего блока except. И поэтому программа аварийно завершит свое выполнение.

Python позволяет в одном блоке except обрабатывать сразу несколько типов исключений. В этом случае все типы исключения передаются в скобках:

try:

number1 = int(input("Введите первое число: "))

number2 = int(input("Введите второе число: "))

print("Результат деления:", number1/number2)

except (ZeroDivisionError, ValueError):    #  обработка двух типов исключений - ZeroDivisionError и ValueError

print("Попытка деления числа на ноль или некорректный ввод")

print("Завершение программы")

Получение информации об исключении

С помощью оператора as мы можем передать всю информацию об исключении в переменную, которую затем можно использовать в блоке except:

try:

number = int(input("Введите число: "))

print("Введенное число:", number)

except ValueError as e:

print("Сведения об исключении", e)

print("Завершение программы")

Пример некорректного ввода:

Введите число: fdsf
Сведения об исключении invalid literal for int() with base 10: 'fdsf'
Завершение программы