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