English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной учебник Python

Управление потоком в Python

Функции в Python

Типы данных в Python

Файловые операции в Python

Объекты и классы в Python

Даты и время в Python

Продвинутые знания Python

Руководство по Python

Обработка исключений в Python - Try, Except и finally

В этой статье вы узнаете, как использовать операторы try, except и finally для обработки исключений в программах Python. Это вдохновит вас писать чистый, читаемый и эффективный код на Python.

Что такое исключения в Python?

Python имеет многоВнутренние исключения  Когда в них出现某些 ошибки, они принудительно заставляют ваш program выдавать ошибки.

Когда происходят эти исключения, они приводят к остановке текущего процесса и передают его вызовному процессу, пока его не обработают. Если не обрабатывать, наш的程序 будет аварийно завершен.

Например, если функция A вызывает функцию B, а функция B, в свою очередь, вызывает функцию C, и в функции C происходит исключение. Если это исключение не обработать в C, то оно будет передано B, а затем A.

Если не обрабатывать его, то будет выброшено сообщение об ошибке, и наш程序 внезапно остановится.

В Python можно уловить исключение

В Python можно использовать оператор try для обработки исключений.

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

После捕获 исключения, что мы будем делать, зависит от нас самих. Это простая пример.

# Импорт модуля sys для получения типа исключения
import sys
randomList = ['a', 0, 2]
for entry in randomList:
    try:
        print("Входные данные равны", entry)
        r = 1/int(entry)
        break
    except:
        print("Oops!", sys.exc_info()[0], "возник.")
        print("Следующее входное данные.")
        print()
print("Обратное значение", entry, "равно", r)

Результат вывода

Входные данные равны 'a'
Oops! <class 'ValueError'> возник.
Следующее входное данные.
Входные данные равны 0
Oops! <class 'ZeroDivisionError'> возник.
Следующее входное данные.
Входной данные равны 2
Обратное значение 2 равно 0.5

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

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

Здесь мы используем функцию exinfo() из модуля sys для печати имени исключения и предлагаем пользователю попробовать еще раз. Мы можем видеть, что значения 'a' и '1.3' вызывают ValueError, а '0' вызывает ZeroDivisionError.

Захват специфических исключений в Python

В примере, приведенном выше, мы не упоминаем ни одного исключения в except-подпрограмме.

Это не guter программистский навык, так как он будет захватывать все исключения и обрабатывать每种 случай в одном и том же стиле. Мы можем определить, какие исключения будут захватывать except-подпрограммы.

Одна try-подпрограмма может иметь любое количество except-подпрограмм для обработки их по-разному, но при возникновении исключения выполняется только одна except-подпрограмма.

Мы можем использовать тупл с значениями для указания нескольких исключений вexcept-подпрограмме. Вот пример伪-кода.

try:
   # Выполнение某些 кодов
   пропустить
except ValueError:
   # Обработка исключения ValueError
   пропустить
except (TypeError, ZeroDivisionError):
   # Обработка нескольких исключений
   # TypeError и ZeroDivisionError исключения
   пропустить
except:
   # Обработка всех других исключений
   пропустить

Взбрасывание исключения

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

Мы также можем выбрать передачу значения в исключение, чтобы прояснить, почему вызывается исключение.

>>> raise KeyboardInterrupt
Traceback (последний вызов в начале):
...
KeyboardInterrupt
>>> raise MemoryError("Это argument")
Traceback (последний вызов в начале):
...
MemoryError: Это argument
>>> try:
...        a = int(input("Введите положительное целое число: "))
...        if a <= 0:
...        raise ValueError("Это не положительное число!")
...    except ValueError as ve:
...    print(ve)
...    
Введите положительное целое число: -2
Это не положительное число!

try...finally

В Python try-инструкция может иметь опциональный finally-подраздел. Этот раздел всегда выполняется в любом случае и обычно используется для освобождения внешних ресурсов.

Например, мы можем подключиться к удаленному数据中心 через сеть, или использовать файлы или графический интерфейс пользователя (GUI).

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

ЭтоОперации с файламиПример для ilustration этого.

try:
   f = open("test.txt", encoding = 'utf-8')
   # Выполнение операций с файлами
finally:
   f.close()

Этот тип constructions обеспечивает закрытие файла, даже если происходит исключение.