Обработка исключений Python

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

  • Обработка исключений: Учебник по Python на этом сайте расскажет об этом подробно.
  • Утверждения: Учебник по Python на этом сайте расскажет об этом подробно.

Стандартные исключения Python

Имя исключенияОписание
BaseExceptionБазовый класс для всех исключений
SystemExitИнтерпретатор запросил выход
KeyboardInterruptПрерывание выполнения пользователем (обычно путем ввода ^C)
ИсключениеБазовый класс для общих ошибок
StopIteration У итератора больше нет значений
GeneratorExit Генератор возбуждает исключение, чтобы уведомить о выходе
StandardErrorБазовый класс для всех встроенных стандартных исключений
ArithmeticError Базовый класс для всех ошибок числовых вычислений
FloatingPointError Ошибка вычислений с плавающей запятой
OverflowErrorЧисловая операция превышает максимальный предел
ZeroDivisionErrorДеление (или остаток от деления) на ноль (для всех типов данных)
AssertionErrorНе выполнен оператор утверждения
AttributeErrorОбъект не имеет этого атрибута
EOFError Нет встроенного ввода, достигнут маркер EOF
EnvironmentError Базовый класс для ошибок операционной системы
IOError Операция ввода-вывода не выполнена
OSError Ошибка операционной системы
WindowsErrorСистемный вызов не выполнен
ImportError Не удалось импортировать модуль/объект
LookupError Базовый класс для запросов с неверными данными
IndexErrorВ последовательности нет такого индекса
KeyErrorВ отображении нет такого ключа
MemoryErrorОшибка переполнения памяти (не фатальная для интерпретатора Python)
NameErrorНеобъявленный/неинициализированный объект (без атрибутов)
UnboundLocalError Обращение к неинициализированной локальной переменной
ReferenceErrorСлабая ссылка пытается обратиться к объекту, который был собран сборщиком мусора
RuntimeError Общая ошибка времени выполнения
NotImplementedErrorМетод еще не реализован
SyntaxErrorСинтаксическая ошибка Python
IndentationErrorОшибка отступов
TabErrorСмешивание табуляций и пробелов
SystemError Общая системная ошибка интерпретатора
TypeErrorНедопустимая операция над типом
ValueError Передан недопустимый аргумент
UnicodeError Ошибки, связанные с Unicode
UnicodeDecodeError Ошибка при декодировании Unicode
UnicodeEncodeError Ошибка при кодировании Unicode
UnicodeTranslateErrorОшибка при преобразовании Unicode
Предупреждение Базовый класс для предупреждений
DeprecationWarningПредупреждение об устаревших возможностях
FutureWarning Предупреждение о конструкциях, семантика которых изменится в будущем
OverflowWarningСтарое предупреждение об автоматическом преобразовании в длинное целое (long)
PendingDeprecationWarningПредупреждение о возможностях, которые устареют
RuntimeWarning Предупреждение о подозрительном поведении во время выполнения
SyntaxWarningПредупреждение о подозрительном синтаксисе
UserWarningПредупреждение, сгенерированное пользовательским кодом

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

Исключение — это событие, которое возникает во время выполнения программы и влияет на нормальное выполнение программы.

Как правило, когда Python не может нормально обработать программу, возникает исключение.

Исключения — это объекты Python, которые представляют ошибку.

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


Обработка исключений

Вы можете перехватывать исключения с помощью инструкций try/except.

Инструкция try/except используется для обнаружения ошибок в блоке try, чтобы инструкция except могла перехватить информацию об исключении и обработать её.

Если вы не хотите, чтобы ваша программа завершалась при возникновении исключения, просто перехватите его в try.

Синтаксис:

Ниже приведён простойtry....except...elseсинтаксис:

try:
<语句>        #运行别的代码
except <名字>:
<语句>        #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句>        #如果引发了'name'异常,获得附加的数据
else:
<语句>        #如果没有异常发生

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

  • Если исключение возникает при выполнении оператора после try, Python возвращается к try и выполняет первый блок except, соответствующий исключению. После обработки исключения поток управления проходит через весь оператор try (если только во время обработки исключения не возникнет новое исключение).
  • Если исключение возникает в операторе после try, но нет соответствующего блока except, исключение будет передано во внешний try или на верхний уровень программы (что завершит программу и выведет сообщение об ошибке по умолчанию).
  • Если во время выполнения блока try не возникает исключение, Python выполнит оператор после else (если else есть), затем поток управления проходит через весь оператор try.

Пример

Ниже приведён простой пример, который открывает файл, записывает в него содержимое, и исключение не возникает:

Пример

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    fh.write("Это тестовый файл для проверки исключений!!")
except IOError:
    print "Ошибка: файл не найден или не удалось прочитать файл"
else:
    print "Содержимое успешно записано в файл"
    fh.close()

Вывод вышеприведённой программы:

$ python test.py 
内容写入文件成功
$ cat testfile       # 查看写入的内容
这是一个测试文件,用于测试异常!!

Пример

Ниже приведён простой пример, который открывает файл, записывает в него содержимое, но файл не имеет разрешения на запись, поэтому возникает исключение:

Пример

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    fh.write("Это тестовый файл для проверки исключений!!")
except IOError:
    print "Ошибка: файл не найден или не удалось прочитать файл"
else:
    print "Содержимое успешно записано в файл"
    fh.close()

Перед выполнением кода, для удобства тестирования, мы можем сначала убрать разрешение на запись для файла testfile. Команда выглядит так:

chmod -w testfile

Затем выполните приведённый выше код:

$ python test.py 
Error: 没有找到文件或读取文件失败

Использование except без указания типа исключения

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

try:
    正常的操作
   ......................
except:
    发生异常,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

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


Использование except с несколькими типами исключений

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

try:
    正常的操作
   ......................
except(Exception1[, Exception2[,...ExceptionN]]):
   发生以上多个异常中的一个,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

Оператор try-finally

Оператор try-finally выполняет завершающий код независимо от того, возникло ли исключение.

try:
<语句>
finally:
<语句>    #退出try时总会执行
raise

Пример

Пример

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    fh.write("Это тестовый файл для проверки исключений!!")
finally:
    print "Ошибка: файл не найден или не удалось прочитать файл"

Если у открытого файла нет разрешения на запись, вывод будет следующим:

$ python test.py 
Error: 没有找到文件或读取文件失败

Тот же пример можно также записать следующим образом:

Пример

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    try:
        fh.write("Это тестовый файл для проверки исключений!!")
    finally:
        print "Закрыть файл"
        fh.close()
except IOError:
    print "Ошибка: файл не найден или не удалось прочитать файл"

Когда в блоке try выбрасывается исключение, код в блоке finally выполняется немедленно.

После выполнения всех инструкций блока finally исключение снова выбрасывается, и выполняется код блока except.

Содержимое параметра отличается от исключения.


Аргументы исключения

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

Вы можете перехватить аргументы исключения с помощью оператора except, как показано ниже:

try:
    正常的操作
   ......................
except ExceptionType, Argument:
    你可以在这输出 Argument 的值...

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

Кортеж обычно содержит строку ошибки, номер ошибки и местоположение ошибки.

Пример

Ниже приведён пример одного исключения:

Пример

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# Определить функцию
def temp_convert(var):
    try:
        return int(var)
    except ValueError, Argument:
        print "Аргумент не содержит числа"\n", Argument

# Вызов функции
temp_convert("xyz")

Результат выполнения вышеуказанной программы выглядит так:

$ python test.py 
参数没有包含数字
invalid literal for int() with base 10: 'xyz'

Возбуждение исключений

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

Синтаксис raise выглядит следующим образом:

raise [Exception [, args [, traceback]]]

В инструкции Exception — это тип исключения (например, NameError), один из стандартных исключений; args — это аргумент исключения, который вы предоставляете сами.

Последний параметр необязателен (редко используется на практике); если он присутствует, это объект traceback.

Пример

Исключение может быть строкой, классом или объектом. Большинство исключений, предоставляемых ядром Python, являются экземплярами классов, которые являются параметрами экземпляра класса.

Определить исключение очень просто, как показано ниже:

Пример

def functionName( level ):
    if level < 1:
        raise Exception("Invalid level!", level)
        # После возбуждения исключения последующий код не будет выполнен

Примечание:Чтобы перехватить исключение, инструкция "except" должна использовать тот же объект класса исключения или строку, что и возбуждённое исключение.

Например, чтобы перехватить вышеуказанное исключение, инструкция "except" выглядит следующим образом:

try:
    正常逻辑
except Exception,err:
    触发自定义异常    
else:
    其余代码

Пример

Пример

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# Определить функцию
def mye( level ):
    if level < 1:
        raise Exception,"Invalid level!"
        # После возбуждения исключения последующий код не будет выполнен
try:
    mye(0)            # Возбудить исключение
except Exception,err:
    print 1,err
else:
    print 2

При выполнении приведённого выше кода вывод будет следующим:

$ python test.py 
1 Invalid level!

Пользовательские исключения

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

Ниже приведён пример, связанный с RuntimeError. В примере создаётся класс с базовым классом RuntimeError, используемый для вывода дополнительной информации при срабатывании исключения.

В блоке try блок except выполняется после того, как возбуждено пользовательское исключение. Переменная e используется для создания экземпляра класса Networkerror.

class Networkerror(RuntimeError):
    def __init__(self, arg):
        self.args = arg

После определения вышеуказанного класса можно возбудить исключение следующим образом:

try:
    raise Networkerror("Bad hostname")
except Networkerror,e:
    print e.args
Другие расширения