- 6 августа 2025
- 5 минут
- 172
Обработка исключений в коде программы на Python
Статью подготовили специалисты образовательного сервиса Zaochnik.
Чтение ошибок и их обработка
Ошибки в процессе работы программы являются нормой. Поэтому обработка ошибок занимает важное место в любой программе. В Python все ошибки возникают во время выполнения, что означает, что даже если проблема не связана с синтаксисом, она вызвана определенной операцией на конкретной строке кода. При возникновении необработанного исключения выводится информация об имени файла и номера строки, что позволяет быстрее определить место ошибки:
Traceback (most recent call last):
File " \src\debug\tserver\_sandbox.py", line 5, in <module>
File " \src\debug\tserver\_sandbox.py", line 4, in <fragment>
builtins.IOError: [Errno 2] No such file or directory: ‘A.txt’
Последняя строка сообщает о том, что произошло. Исключения обладают различными типами, которые указаны в сообщении.
```python
>>> 10 * (1/0)
Traceback (most recent call last):
File "<stdin>", line 1
ZeroDivisionError: integer division or modulo
>>> 4 + spam * 3
Traceback (most recent call last):
File "<stdin>", line 1
NameError: spam
>>> '2' + 2
Traceback (most recent call last):
File "<stdin>", line 1
TypeError: illegal argument type for built-in operation
```
В приведенных примерах встречаются типы исключений:
- “ZeroDivisionError”,
- “NameError”,
- “TypeError”.
Имена подобных стандартных исключений - встроенные идентификаторы в Python, но они не резервируются как ключевые слова.
В подробностях сообщения указывается контекст, в котором возникло исключение, в том числе и строки из стека вызовов, исключая строки, полученные со стандартного ввода.
Обработка исключений. Инструкция try
Вы можете создать отдельные кода, которые будут отвечать за обработку конкретных исключений. Рассмотрим следующий пример, где пользователю предлагается ввести целое число до тех пор, пока это не удастся или пока программа не будет прервана (обычно с помощью Ctrl-C), что вызывает исключение `KeyboardInterrupt`.
```python
>>> while 1:
try:
x = int(input("Введите целое число: "))
break
except ValueError:
print("Ошибка. Попробуйте ввести целое число еще раз:")
```
Алгоритм работы инструкции `try` выполняется следующим образом:
- Первым выполняется блок `try` (инструкции, расположенные между `try` и `except`).
- Если в процессе выполнения блока `try` не возникает исключений, выполнение переходит к завершению блока `try`, а ветвь `except` пропускается.
- В случае, когда во время выполнения блока `try` возникает исключение, оставшаяся часть блока игнорируется. В последующем шаге, если тип (класс) исключения эквивалентен тому, что указано за ключевым словом `except`, происходит выполнение блока `except`, и блок `try` завершает работу.
- В случае, когда исключение не эквивалентно указанному, происходит передача исключения внешнему блоку `try`, и если обработчик не был найден, программа завершается с выдачей сообщения об ошибке.
Обработчики могут перехватывать не только исключения, сгенерированные в блоке `try`, но и те, что возникают в вызываемых из него функциях.
Генерация исключений. Команда raise
Команда `raise` позволяет явно вызывать исключение.
```python
>>> raise NameError('HiThere')
Traceback (most recent call last):
File "<stdin>", line 1
NameError: HiThere
```
В качестве аргумента `raise` должен передаваться экземпляр класса. Класс определяет тип исключения, а аргумент конструктора обычно содержит описание причины возникновения исключения.
“Страхование” от ошибок. Блок finally
Еще одним вариантом инструкции `try` является определение блока `finally`, который будет выполняться в любом случае.
```python
>>> try:
raise KeyboardInterrupt()
finally:
print('До новых встреч!')
```
Вывод будет следующим:
До новых встреч!
Traceback (most recent call last):
File "<stdin>", line 2
KeyboardInterrupt
Блок `finally` выполняется, независимо от того, возникло ли исключение в блоке `try` или нет, включая ситуации, когда выход происходит с помощью `break` или `return`.