Встроенные типы исключений
В примере выше обрабатывались сразу все исключения, которые могут возникнуть в коде. Однако мы можем конкретизировать тип обрабатываемого исключения, указав его после слова 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'
Завершение программы