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

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

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

Введение

В этом практическом занятии (лабораторной работе) вы научитесь исследовать и получать доступ к сообщениям об исключениях в Python для эффективной отладки и обработки ошибок. В рамках практики (лабораторной работы) вы создадите скрипт на Python с функцией divide, которая использует блок try...except для перехвата возможных исключений при выполнении деления. Вы увидите, как различные типы исключений, такие как ZeroDivisionError и TypeError, генерируют конкретные сообщения об ошибках.

Затем в практике (лабораторной работе) показано, как получить доступ к объекту исключения и его типу, чтобы получить более подробную информацию об ошибке. Запустив скрипт с разными входными данными, вы увидите, как сообщения об исключениях дают ценную информацию о причинах ошибок, что позволяет вам выявить и исправить проблемы в своем коде.


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") subgraph Lab Skills python/catching_exceptions -.-> lab-559608{{"Как проверить, содержит ли исключение определенное сообщение в Python"}} python/raising_exceptions -.-> lab-559608{{"Как проверить, содержит ли исключение определенное сообщение в Python"}} end

Исследование сообщений об исключениях

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

Сначала создадим файл Python с именем exceptions.py в каталоге ~/project с помощью редактора VS Code.

## exceptions.py
def divide(x, y):
    try:
        result = x / y
        print("The result is:", result)
    except Exception as e:
        print("An error occurred:", e)

divide(10, 2)
divide(10, 0)
divide("hello", 5)

В этом коде:

  • Мы определяем функцию divide(x, y), которая пытается разделить x на y.
  • Мы используем блок try...except для перехвата любых исключений, которые могут возникнуть при выполнении деления.
  • Если возникает исключение, мы выводим сообщение об ошибке вместе с объектом исключения e.

Теперь запустим скрипт exceptions.py с помощью команды python:

python exceptions.py

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

The result is: 5.0
An error occurred: division by zero
An error occurred: unsupported operand type(s) for /: 'str' and 'int'

Как вы можете видеть, первый вызов divide(10, 2) выполняется успешно и выводит результат. Второй вызов, divide(10, 0), вызывает исключение division by zero, которое перехватывается блоком except, и выводится соответствующее сообщение об ошибке. Третий вызов, divide("hello", 5), вызывает исключение TypeError, потому что нельзя разделить строку на целое число.

Теперь изменим файл exceptions.py так, чтобы он выводил тип исключения:

## exceptions.py
def divide(x, y):
    try:
        result = x / y
        print("The result is:", result)
    except Exception as e:
        print("An error occurred:", type(e), e)

divide(10, 2)
divide(10, 0)
divide("hello", 5)

Запустим скрипт еще раз:

python exceptions.py

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

The result is: 5.0
An error occurred: <class 'ZeroDivisionError'> division by zero
An error occurred: <class 'TypeError'> unsupported operand type(s) for /: 'str' and 'int'

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

Получение доступа к аргументам исключения

На этом этапе вы научитесь получать доступ к аргументам (args), связанным с исключением в Python. Аргументы исключения могут предоставить более конкретные детали об ошибке, которая произошла.

Давайте изменим файл exceptions.py, который вы создали на предыдущем этапе, чтобы получить доступ к аргументам исключения и вывести их. Откройте exceptions.py в каталоге ~/project с помощью редактора VS Code.

## exceptions.py
def divide(x, y):
    try:
        result = x / y
        print("The result is:", result)
    except Exception as e:
        print("An error occurred:", type(e), e.args)

divide(10, 2)
divide(10, 0)
divide("hello", 5)

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

Теперь запустите скрипт exceptions.py:

python exceptions.py

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

The result is: 5.0
An error occurred: <class 'ZeroDivisionError'> ('division by zero',)
An error occurred: <class 'TypeError'> ("unsupported operand type(s) for /: 'str' and 'int'",)

Как вы можете видеть, вывод теперь включает аргументы, связанные с каждым исключением. Для ZeroDivisionError аргумент представляет собой кортеж, содержащий строку 'division by zero'. Для TypeError аргумент - это кортеж, содержащий строку "unsupported operand type(s) for /: 'str' and 'int'".

Давайте еще раз изменим файл exceptions.py, чтобы получить прямой доступ к первому аргументу:

## exceptions.py
def divide(x, y):
    try:
        result = x / y
        print("The result is:", result)
    except Exception as e:
        print("An error occurred:", type(e), e.args[0])

divide(10, 2)
divide(10, 0)
divide("hello", 5)

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

python exceptions.py

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

The result is: 5.0
An error occurred: <class 'ZeroDivisionError'> division by zero
An error occurred: <class 'TypeError'> unsupported operand type(s) for /: 'str' and 'int'

Получив доступ к e.args[0], мы можем извлечь первый аргумент исключения, который часто является наиболее информативной частью сообщения об ошибке.

Сопоставление строки сообщения

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

Давайте изменим файл exceptions.py, с которым вы работали, чтобы специально перехватывать исключение ZeroDivisionError и выводить пользовательское сообщение. Откройте exceptions.py в каталоге ~/project с помощью редактора VS Code.

## exceptions.py
def divide(x, y):
    try:
        result = x / y
        print("The result is:", result)
    except ZeroDivisionError as e:
        print("Cannot divide by zero!")
    except Exception as e:
        print("An error occurred:", type(e), e.args[0])

divide(10, 2)
divide(10, 0)
divide("hello", 5)

В этом коде:

  • Мы добавили специальный блок except для ZeroDivisionError.
  • Если возникает исключение ZeroDivisionError, мы выводим сообщение "Cannot divide by zero!".
  • Общий блок except Exception as e будет перехватывать любые другие исключения.

Теперь запустите скрипт exceptions.py:

python exceptions.py

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

The result is: 5.0
Cannot divide by zero!
An error occurred: <class 'TypeError'> unsupported operand type(s) for /: 'str' and 'int'

Как вы можете видеть, когда вызывается divide(10, 0), исключение ZeroDivisionError перехватывается специальным блоком except, и выводится пользовательское сообщение "Cannot divide by zero!". Исключение TypeError, вызванное divide("hello", 5), по-прежнему перехватывается общим блоком except.

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

## exceptions.py
def divide(x, y):
    try:
        result = x / y
        print("The result is:", result)
    except Exception as e:
        if "division by zero" in str(e):
            print("Cannot divide by zero!")
        else:
            print("An error occurred:", type(e), e.args[0])

divide(10, 2)
divide(10, 0)
divide("hello", 5)

В этом коде:

  • Мы перехватываем все исключения в общем блоке except.
  • Мы проверяем, присутствует ли строка "division by zero" в строковом представлении объекта исключения e.
  • Если присутствует, мы выводим "Cannot divide by zero!". В противном случае мы выводим общее сообщение об ошибке.

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

python exceptions.py

Вы должны увидеть такой же вывод, как и раньше:

The result is: 5.0
Cannot divide by zero!
An error occurred: <class 'TypeError'> unsupported operand type(s) for /: 'str' and 'int'

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

Резюме

В этом практическом занятии (лабораторной работе) вы изучили сообщения об исключениях в Python, чтобы понять, как отлаживать и исправлять ошибки. Вы научились использовать блок try...except для перехвата исключений во время операций деления и выводить объект исключения e для просмотра сообщения об ошибке.

Вы также изменили скрипт, чтобы выводить тип исключения, тем самым получая более глубокое понимание природы встречаемых ошибок, таких как ZeroDivisionError и TypeError. Это позволяет проводить более нацеленную отладку и обработку ошибок.