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