Как проверить, было ли вызвано определенное исключение в Python

PythonPythonBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы научитесь проверять, было ли возбуждено определенное исключение в Python. Лабораторная работа сосредоточена на понимании различных типов исключений и способах их эффективной обработки.

Вы изучите общие типы исключений, такие как TypeError, NameError, IndexError, KeyError, ValueError и FileNotFoundError, с помощью практических примеров в скрипте Python. В рамках лабораторной работы вы создадите файл exceptions_demo.py и добавите код, демонстрирующий, как каждый тип исключения возбуждается и перехватывается с использованием блоков try...except.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/raising_exceptions("Raising Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/custom_exceptions("Custom Exceptions") subgraph Lab Skills python/catching_exceptions -.-> lab-559566{{"Как проверить, было ли вызвано определенное исключение в Python"}} python/raising_exceptions -.-> lab-559566{{"Как проверить, было ли вызвано определенное исключение в Python"}} python/custom_exceptions -.-> lab-559566{{"Как проверить, было ли вызвано определенное исключение в Python"}} end

Изучение типов исключений

На этом этапе вы узнаете о различных типах исключений в Python. Исключения - это события, которые нарушают нормальный поток выполнения программы. Понимание типов исключений является важным аспектом эффективной обработки ошибок.

В Python есть множество встроенных исключений, и вы также можете создавать свои собственные. Вот некоторые общие типы исключений:

  • TypeError: Возбуждается, когда операция или функция применяется к объекту несоответствующего типа.
  • NameError: Возбуждается, когда имя не найдено в локальном или глобальном пространстве имен.
  • IndexError: Возбуждается, когда индекс последовательности выходит за пределы допустимого диапазона.
  • KeyError: Возбуждается, когда ключ словаря не найден.
  • ValueError: Возбуждается, когда операция или функция получает аргумент правильного типа, но с несоответствующим значением.
  • FileNotFoundError: Возбуждается, когда запрашивается файл или каталог, но он не может быть найден.

Познакомимся с этими типами исключений на примерах. Мы создадим скрипт Python с именем exceptions_demo.py в каталоге ~/project с использованием редактора VS Code.

  1. Откройте VS Code.
  2. Создайте новый файл с именем exceptions_demo.py в каталоге ~/project.
  3. Добавьте следующий код в файл exceptions_demo.py:
## TypeError
try:
    result = 1 + "a"
except TypeError as e:
    print(f"TypeError: {e}")

## NameError
try:
    print(undefined_variable)
except NameError as e:
    print(f"NameError: {e}")

## IndexError
try:
    my_list = [1, 2, 3]
    print(my_list[5])
except IndexError as e:
    print(f"IndexError: {e}")

## KeyError
try:
    my_dict = {"a": 1, "b": 2}
    print(my_dict["c"])
except KeyError as e:
    print(f"KeyError: {e}")

## ValueError
try:
    num = int("abc")
except ValueError as e:
    print(f"ValueError: {e}")

## FileNotFoundError
try:
    with open("nonexistent_file.txt", "r") as f:
        content = f.read()
except FileNotFoundError as e:
    print(f"FileNotFoundError: {e}")

Этот скрипт демонстрирует, как различные типы исключений возбуждаются и перехватываются с использованием блоков try...except. Каждый блок try содержит код, который может вызвать определенное исключение. Если исключение возникает, выполняется соответствующий блок except.

Теперь запустим скрипт:

  1. Откройте терминал в VS Code.
  2. Перейдите в каталог ~/project:
cd ~/project
  1. Запустите скрипт exceptions_demo.py с помощью команды python:
python exceptions_demo.py

Вы должны увидеть следующий вывод:

TypeError: unsupported operand type(s) for +: 'int' and 'str'
NameError: name 'undefined_variable' is not defined
IndexError: list index out of range
KeyError: 'c'
ValueError: invalid literal for int() with base 10: 'abc'
FileNotFoundError: [Errno 2] No such file or directory: 'nonexistent_file.txt'

Этот вывод показывает, что каждый блок try вызвал ожидаемое исключение, и соответствующий блок except перехватил и напечатал сообщение об исключении.

Понимание различных типов исключений и способов их обработки является важным аспектом написания надежного и устойчивого к ошибкам кода на Python. На следующем этапе вы узнаете, как перехватывать конкретные исключения и обрабатывать их соответствующим образом.

Перехват конкретного исключения

На предыдущем этапе вы узнали о различных типах исключений в Python. Теперь вы узнаете, как перехватывать конкретное исключение с помощью блока try...except. Это позволяет обрабатывать разные ошибки по-разному, делая ваш код более надежным.

При перехвате исключений рекомендуется быть как можно более конкретным. Это предотвращает случайное перехват исключений, которые блок except не был предназначен для обработки, что может скрыть ошибки и усложнить отладку.

Давайте изменим скрипт exceptions_demo.py так, чтобы он перехватывал конкретное исключение, например ValueError, при попытке преобразования строки в целое число.

  1. Откройте файл exceptions_demo.py в каталоге ~/project с помощью VS Code.
  2. Измените скрипт так, чтобы он перехватывал только ValueError при преобразовании строки в целое число:
try:
    num = int("abc")
except ValueError as e:
    print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

В этом примере мы специально перехватываем ValueError, который возникает, когда int("abc") завершается неудачно. Если в блоке try возникнет какое-либо другое исключение, оно будет перехвачено блоком except Exception as e:. Строка print("Continuing execution...") всегда будет выполнена, если какое-либо исключение было перехвачено, что демонстрирует, что программа продолжает работу после обработки исключения.

Теперь запустим скрипт:

  1. Откройте терминал в VS Code.
  2. Перейдите в каталог ~/project:
cd ~/project
  1. Запустите скрипт exceptions_demo.py с помощью команды python:
python exceptions_demo.py

Вы должны увидеть следующий вывод:

ValueError caught: invalid literal for int() with base 10: 'abc'
Continuing execution...

Этот вывод показывает, что ValueError был перехвачен, и программа продолжила выполнение.

Теперь изменим скрипт так, чтобы он вызывал другое исключение, например TypeError, и посмотрим, как оно будет обрабатываться:

  1. Откройте файл exceptions_demo.py в каталоге ~/project с помощью VS Code.
  2. Измените скрипт так, чтобы он вызывал TypeError:
try:
    result = 1 + "a"
except ValueError as e:
    print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

Теперь запустите скрипт еще раз:

python exceptions_demo.py

Вы должны увидеть следующий вывод:

Some other exception: unsupported operand type(s) for +: 'int' and 'str'
Continuing execution...

Этот вывод показывает, что TypeError был перехвачен блоком except Exception as e:, так как нет конкретного блока except TypeError.

Перехват конкретных исключений позволяет обрабатывать разные ошибки по-разному, делая ваш код более надежным и легким для отладки. На следующем этапе вы узнаете, как проверить экземпляр исключения.

Проверка экземпляра исключения

На этом этапе вы узнаете, как проверить экземпляр исключения, чтобы получить больше информации об ошибке, которая произошла. Когда вы перехватываете исключение, вы можете получить доступ к самому объекту исключения, который содержит детали об ошибке.

Давайте изменим скрипт exceptions_demo.py так, чтобы он выводил тип и аргументы экземпляра исключения.

  1. Откройте файл exceptions_demo.py в каталоге ~/project с помощью VS Code.
  2. Измените скрипт так, чтобы он выводил тип и аргументы исключения ValueError:
try:
    num = int("abc")
except ValueError as e:
    print(f"Exception type: {type(e)}")
    print(f"Exception arguments: {e.args}")
    print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

В этом примере мы выводим тип объекта исключения с помощью type(e) и аргументы исключения с помощью e.args. Атрибут e.args представляет собой кортеж, содержащий аргументы, переданные конструктору исключения.

Теперь запустим скрипт:

  1. Откройте терминал в VS Code.
  2. Перейдите в каталог ~/project:
cd ~/project
  1. Запустите скрипт exceptions_demo.py с помощью команды python:
python exceptions_demo.py

Вы должны увидеть следующий вывод:

Exception type: <class 'ValueError'>
Exception arguments: ("invalid literal for int() with base 10: 'abc'",)
ValueError caught: invalid literal for int() with base 10: 'abc'
Continuing execution...

Этот вывод показывает тип исключения (ValueError) и аргументы, переданные конструктору исключения (кортеж, содержащий сообщение об ошибке).

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

Например, вы можете проверить, содержит ли аргумент исключения определенное сообщение об ошибке:

try:
    num = int("abc")
except ValueError as e:
    if "invalid literal" in e.args[0]:
        print("Invalid input: Please enter a valid number.")
    else:
        print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

В этом примере мы проверяем, содержит ли первый аргумент исключения ValueError строку "invalid literal". Если содержит, мы выводим более конкретное сообщение об ошибке.

Проверка экземпляра исключения позволяет более интеллектуально обрабатывать ошибки и предоставлять более информативные сообщения об ошибках пользователю.

Резюме

В этом практическом занятии (лабораторной работе) первое действие направлено на понимание различных типов исключений в Python, которые являются важными для эффективной обработки ошибок. В рамках практики представлены распространенные встроенные исключения, такие как TypeError, NameError, IndexError, KeyError, ValueError и FileNotFoundError.

Затем в практике приводятся практические примеры того, как эти исключения вызываются и перехватываются с использованием блоков try...except. Создан скрипт Python с именем exceptions_demo.py, который демонстрирует каждый тип исключения, показывая, как предвидеть и обрабатывать потенциальные ошибки, которые могут нарушить нормальный ход выполнения программы.