Введение
В этом практическом занятии (лабораторной работе) вы научитесь исследовать и получать доступ к сообщениям об исключениях в Python для эффективной отладки и обработки ошибок. В рамках практики (лабораторной работы) вы создадите скрипт на Python с функцией divide, которая использует блок try...except для перехвата возможных исключений при выполнении деления. Вы увидите, как различные типы исключений, такие как ZeroDivisionError и TypeError, генерируют конкретные сообщения об ошибках.
Затем в практике (лабораторной работе) показано, как получить доступ к объекту исключения и его типу, чтобы получить более подробную информацию об ошибке. Запустив скрипт с разными входными данными, вы увидите, как сообщения об исключениях дают ценную информацию о причинах ошибок, что позволяет вам выявить и исправить проблемы в своем коде.
Исследование сообщений об исключениях
На этом этапе вы научитесь исследовать сообщения об исключениях в 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. Это позволяет проводить более нацеленную отладку и обработку ошибок.



