Встроенные исключения¶
В Python все исключения должны быть экземплярами класса, производного от BaseException
. В операторе try
с предложением except
, в котором упоминается определенный класс, это предложение также обрабатывает любые классы исключений, производные от этого класса (но не классы исключений, от которых он является производным). Два класса исключений, не связанных между собой через подклассы, никогда не эквивалентны, даже если у них одинаковое имя.
Перечисленные ниже встроенные исключения могут быть сгенерированы интерпретатором или встроенными функциями. За исключением упомянутых случаев, они имеют «ассоциированное значение», указывающее на подробную причину ошибки. Это может быть строка или кортеж из нескольких элементов информации (например, код ошибки и строка, поясняющая код). Ассоциированное значение обычно передается в качестве аргумента конструктору класса исключения.
Пользовательский код может вызывать встроенные исключения. Это может быть использовано для тестирования обработчика исключений или для сообщения о состоянии ошибки «точно так же», как и в ситуации, когда интерпретатор вызывает то же самое исключение; но следует помнить, что ничто не мешает пользовательскому коду вызвать неподходящую ошибку.
Встроенные классы исключений могут быть подклассами для определения новых исключений; программистам рекомендуется выводить новые исключения из класса Exception
или одного из его подклассов, а не из BaseException
. Более подробную информацию об определении исключений можно найти в учебнике Python в разделе Определяемые пользователем исключения.
Контекст исключения¶
При создании нового исключения, когда другое исключение уже обрабатывается, атрибут __context__
нового исключения автоматически устанавливается на обрабатываемое исключение. Исключение может быть обработано, когда используется предложение except
или finally
, или оператор with
.
Этот неявный контекст исключения можно дополнить явной причиной, используя from
с raise
:
raise new_exc from original_exc
Выражение, следующее за from
, должно быть исключением или None
. Оно будет установлено как __cause__
в поднятом исключении. Установка __cause__
также неявно устанавливает атрибут __suppress_context__
в True
, так что использование raise new_exc from None
эффективно заменяет старое исключение новым для целей отображения (например, преобразование KeyError
в AttributeError
), оставляя старое исключение доступным в __context__
для интроспекции при отладке.
Код отображения обратного следа по умолчанию показывает эти цепочки исключений в дополнение к обратным следам самого исключения. Явно связанное исключение в __cause__
всегда отображается, если оно присутствует. Неявно связанное исключение в __context__
показывается только в том случае, если __cause__
равно None
и __suppress_context__
равно false.
В любом случае, само исключение всегда показывается после всех цепочек исключений, так что последняя строка трассировки всегда показывает последнее поднятое исключение.
Наследование от встроенных исключений¶
Пользовательский код может создавать подклассы, наследующие от типа исключения. Рекомендуется одновременно создавать подклассы только одного типа исключений, чтобы избежать возможных конфликтов между тем, как базы обрабатывают атрибут args
, а также из-за возможной несовместимости расположения памяти.
CPython implementation detail: Большинство встроенных исключений для эффективности реализованы на языке C, см: Objects/exceptions.c. Некоторые из них имеют пользовательскую компоновку памяти, что делает невозможным создание подкласса, наследующего от нескольких типов исключений. Схема памяти типа является деталью реализации и может меняться между версиями Python, что приведет к новым конфликтам в будущем. Поэтому рекомендуется избегать создания подклассов для нескольких типов исключений.
Базовые классы¶
Следующие исключения используются в основном как базовые классы для других исключений.
-
exception
BaseException
¶ -
Базовый класс для всех встроенных исключений. Он не предназначен для прямого наследования пользовательскими классами (для этого используйте
Exception
). Еслиstr()
вызывается на экземпляре этого класса, возвращается представление аргумента(ов) экземпляра, или пустая строка, если аргументов не было.-
args
¶ -
Кортеж аргументов, передаваемых конструктору исключения. Некоторые встроенные исключения (например,
OSError
) ожидают определенного количества аргументов и придают особое значение элементам этого кортежа, в то время как другие обычно вызываются только с одной строкой, содержащей сообщение об ошибке.
-
with_traceback
(tb)¶ -
Этот метод устанавливает tb в качестве нового обратного пути для исключения и возвращает объект исключения. Этот метод чаще всего использовался до появления возможностей цепочки исключений в PEP 3134. Следующий пример показывает, как мы можем преобразовать экземпляр
SomeException
в экземплярOtherException
, сохраняя при этом обратную связь. После поднятия текущий кадр выталкивается в трассировкуOtherException
, как это произошло бы с трассировкой исходногоSomeException
, если бы мы позволили ему распространиться на вызывающую сторону.try: ... except SomeException: tb = sys.exc_info()[2] raise OtherException(...).with_traceback(tb)
-
-
exception
Exception
¶ -
Все встроенные исключения, не являющиеся системными, являются производными от этого класса. Все определяемые пользователем исключения также должны быть производными от этого класса.
-
exception
ArithmeticError
¶ -
Базовый класс для тех встроенных исключений, которые возникают при различных арифметических ошибках:
OverflowError
,ZeroDivisionError
,FloatingPointError
.
-
exception
BufferError
¶ -
Возникает, когда операция, связанная с buffer, не может быть выполнена.
-
exception
LookupError
¶ -
Базовый класс для исключений, которые возникают, когда ключ или индекс, используемый в отображении или последовательности, недействителен:
IndexError
,KeyError
. Оно может быть вызвано непосредственноcodecs.lookup()
.
Бетонные исключения¶
Ниже перечислены исключения, которые обычно поднимаются.
-
exception
AssertionError
¶ -
Возникает при неудачном выполнении оператора
assert
.
-
exception
AttributeError
¶ -
Возникает, когда ссылка на атрибут (см. Ссылки на атрибуты) или присвоение не удается. (Если объект вообще не поддерживает ссылки на атрибуты или присвоение атрибутов, то вызывается
TypeError
).Атрибуты
name
иobj
могут быть установлены с помощью аргументов конструктора, содержащих только ключевые слова. Когда они установлены, они представляют имя атрибута, к которому пытались получить доступ, и объекта, к которому был получен доступ для этого атрибута, соответственно.Изменено в версии 3.10: Добавлены атрибуты
name
иobj
.
-
exception
EOFError
¶ -
Возникает, когда функция
input()
достигает состояния конца файла (EOF) без чтения каких-либо данных. (N.B.: методыio.IOBase.read()
иio.IOBase.readline()
при попадании в EOF возвращают пустую строку).
-
exception
FloatingPointError
¶ -
В настоящее время не используется.
-
exception
GeneratorExit
¶ -
Возникает при закрытии generator или coroutine; см.
generator.close()
иcoroutine.close()
. Наследуется непосредственно отBaseException
вместоException
, поскольку технически это не является ошибкой.
-
exception
ImportError
¶ -
Возникает, когда оператор
import
испытывает проблемы при попытке загрузить модуль. Также вызывается, когда «from list» вfrom ... import
имеет имя, которое не может быть найдено.Атрибуты
name
иpath
могут быть заданы с помощью аргументов конструктора, содержащих только ключевые слова. Когда они установлены, они представляют имя модуля, который пытались импортировать, и путь к любому файлу, который вызвал исключение, соответственно.Изменено в версии 3.3: Добавлены атрибуты
name
иpath
.
-
exception
ModuleNotFoundError
¶ -
Подкласс
ImportError
, который вызываетсяimport
, когда модуль не может быть найден. Он также вызывается, когдаNone
найден вsys.modules
.Добавлено в версии 3.6.
-
exception
IndexError
¶ -
Возникает, когда подскрипт последовательности выходит за пределы диапазона. (Индексы срезов молча усекаются, чтобы попасть в допустимый диапазон; если индекс не является целым числом, выдается сообщение
TypeError
).
-
exception
KeyError
¶ -
Возникает, когда ключ отображения (словаря) не найден в наборе существующих ключей.
-
exception
KeyboardInterrupt
¶ -
Возникает, когда пользователь нажимает клавишу прерывания (обычно Control-C или Delete). Во время выполнения регулярно выполняется проверка на наличие прерываний. Исключение наследуется от
BaseException
, чтобы не быть случайно пойманным кодом, который ловитException
, и тем самым предотвратить выход интерпретатора.Примечание
Ловля
KeyboardInterrupt
требует особого внимания. Поскольку он может быть вызван в непредсказуемые моменты, в некоторых обстоятельствах он может оставить выполняющуюся программу в непоследовательном состоянии. Обычно лучше всего позволитьKeyboardInterrupt
завершить программу как можно быстрее или не поднимать его совсем. (См. Примечание об обработчиках сигналов и исключениях.)
-
exception
MemoryError
¶ -
Возникает, когда у операции закончилась память, но ситуацию еще можно спасти (удалив некоторые объекты). Ассоциированное значение — это строка, указывающая, какая именно (внутренняя) операция исчерпала память. Обратите внимание, что из-за архитектуры управления памятью (функция Си
malloc()
) интерпретатор не всегда может полностью выйти из этой ситуации; тем не менее, он вызывает исключение, чтобы можно было вывести трассировку стека, в случае, если причиной была запущенная программа.
-
exception
NameError
¶ -
Возникает, когда локальное или глобальное имя не найдено. Это относится только к неквалифицированным именам. Соответствующим значением является сообщение об ошибке, включающее имя, которое не удалось найти.
Атрибут
name
может быть установлен с помощью аргумента конструктора, содержащего только ключевое слово. При установке он представляет имя переменной, к которой была предпринята попытка доступа.Изменено в версии 3.10: Добавлен атрибут
name
.
-
exception
NotImplementedError
¶ -
Это исключение является производным от
RuntimeError
. В базовых классах, определяемых пользователем, абстрактные методы должны вызывать это исключение, когда они требуют от производных классов переопределить метод, или во время разработки класса, чтобы указать, что реальная реализация еще должна быть добавлена.Примечание
Он не должен использоваться для указания на то, что оператор или метод не должен поддерживаться вообще — в этом случае либо оставьте оператор / метод неопределенным, либо, если это подкласс, установите его в
None
.Примечание
NotImplementedError
иNotImplemented
не являются взаимозаменяемыми, хотя имеют схожие названия и назначение. См. разделNotImplemented
для получения подробной информации о том, когда его следует использовать.
-
exception
OSError
([arg])¶ -
exception
OSError
(errno, strerror[, filename[, winerror[, filename2]]]) -
Это исключение возникает, когда системная функция возвращает системную ошибку, включая ошибки ввода-вывода, такие как «файл не найден» или «диск заполнен» (не для недопустимых типов аргументов или других случайных ошибок).
Вторая форма конструктора устанавливает соответствующие атрибуты, описанные ниже. Если атрибуты не указаны, то по умолчанию они имеют значение
None
. Для обратной совместимости, если передается три аргумента, атрибутargs
содержит только кортеж из двух первых аргументов конструктора.Конструктор часто возвращает подкласс
OSError
, как описано ниже в OS exceptions. Конкретный подкласс зависит от конечного значенияerrno
. Такое поведение имеет место только при конструированииOSError
напрямую или через псевдоним, и не наследуется при создании подклассов.-
errno
¶ -
Числовой код ошибки из переменной языка C
errno
.
-
winerror
¶ -
В Windows это дает вам код ошибки Windows. Атрибут
errno
является приблизительным переводом, в терминах POSIX, этого кода ошибки.Под Windows, если аргумент конструктора winerror является целым числом, атрибут
errno
определяется из кода ошибки Windows, а аргумент errno игнорируется. На других платформах аргумент winerror игнорируется, а атрибутwinerror
не существует.
-
strerror
¶ -
Соответствующее сообщение об ошибке, предоставляемое операционной системой. Форматируется функциями языка Си
perror()
под POSIX иFormatMessage()
под Windows.
-
filename
¶ -
filename2
¶ -
Для исключений, включающих путь к файловой системе (например,
open()
илиos.unlink()
),filename
— это имя файла, переданное в функцию. Для функций, включающих два пути к файловой системе (например,os.rename()
),filename2
соответствует второму имени файла, переданному в функцию.
Изменено в версии 3.3:
EnvironmentError
,IOError
,WindowsError
,socket.error
,select.error
иmmap.error
были объединены вOSError
, и конструктор может возвращать подкласс.Изменено в версии 3.4: Атрибутом
filename
теперь является исходное имя файла, переданное функции, а не имя, закодированное в или декодированное из filesystem encoding and error handler. Также был добавлен аргумент и атрибут конструктора filename2. -
-
exception
OverflowError
¶ -
Возникает, когда результат арифметической операции слишком велик для представления. Это не может произойти для целых чисел (которые скорее поднимут
MemoryError
, чем сдадутся). Однако по историческим причинам OverflowError иногда возникает для целых чисел, которые выходят за пределы требуемого диапазона. Из-за отсутствия стандартизации обработки исключений для операций с плавающей запятой в C, большинство операций с плавающей запятой не проверяются.
-
exception
RecursionError
¶ -
Это исключение является производным от
RuntimeError
. Оно возникает, когда интерпретатор обнаруживает, что превышена максимальная глубина рекурсии (см.sys.getrecursionlimit()
).Добавлено в версии 3.5: Ранее выдавалось обычное
RuntimeError
.
-
exception
ReferenceError
¶ -
Это исключение возникает, когда прокси слабой ссылки, созданный функцией
weakref.proxy()
, используется для доступа к атрибуту референта после того, как он был собран. Для получения дополнительной информации о слабых ссылках см. модульweakref
.
-
exception
RuntimeError
¶ -
Возникает при обнаружении ошибки, которая не попадает ни в одну из других категорий. Связанное значение представляет собой строку, указывающую, что именно пошло не так.
-
exception
StopIteration
¶ -
Возбуждается встроенной функцией
next()
и методом iterator‘s__next__()
для сигнализации о том, что итератор больше не производит элементов.Объект исключения имеет единственный атрибут
value
, который задается в качестве аргумента при конструировании исключения и по умолчанию равенNone
.Когда функция generator или coroutine возвращается, поднимается новый экземпляр
StopIteration
, а значение, возвращенное функцией, используется как параметрvalue
в конструкторе исключения.Если код генератора прямо или косвенно вызывает
StopIteration
, он преобразуется вRuntimeError
(сохраняяStopIteration
в качестве причины нового исключения).Изменено в версии 3.3: Добавлен атрибут
value
и возможность для функций-генераторов использовать его для возврата значения.Изменено в версии 3.5: Введено преобразование RuntimeError через
from __future__ import generator_stop
, см. PEP 479.Изменено в версии 3.7: Включите PEP 479 для всего кода по умолчанию: ошибка
StopIteration
, возникающая в генераторе, преобразуется вRuntimeError
.
-
exception
StopAsyncIteration
¶ -
Должен быть поднят методом
__anext__()
объекта asynchronous iterator для остановки итерации.Добавлено в версии 3.5.
-
exception
SyntaxError
(message, details)¶ -
Возникает, когда синтаксический анализатор сталкивается с синтаксической ошибкой. Это может произойти в операторе
import
, при вызове встроенных функцийcompile()
,exec()
илиeval()
, или при чтении начального сценария или стандартного ввода (также интерактивно).В
str()
экземпляра исключения возвращается только сообщение об ошибке. Details — это кортеж, члены которого также доступны в виде отдельных атрибутов.-
filename
¶ -
Имя файла, в котором произошла синтаксическая ошибка.
-
lineno
¶ -
Номер строки в файле, в которой произошла ошибка. Он индексируется по 1: первая строка в файле имеет
lineno
, равный 1.
-
offset
¶ -
Столбец в строке, в котором произошла ошибка. Он индексируется по 1: первый символ в строке имеет
offset
, равный 1.
-
text
¶ -
Текст исходного кода, в котором произошла ошибка.
-
end_lineno
¶ -
Номер строки в файле, в которой произошла ошибка. Это 1-индекс: первая строка в файле имеет
lineno
, равный 1.
-
end_offset
¶ -
Заканчивается столбец в конечной строке, в которой произошла ошибка. Он индексируется по 1: первый символ в строке имеет
offset
, равный 1.
Для ошибок в полях f-строки сообщение имеет префикс «f-строка: «, а смещения являются смещениями в тексте, построенном из выражения замены. Например, компиляция f’Bad {a b} field“ приводит к такому атрибуту args: („f-string: …“, („“, 1, 2, „(a b)n“, 1, 5)).
Изменено в версии 3.10: Добавлены атрибуты
end_lineno
иend_offset
. -
-
exception
IndentationError
¶ -
Базовый класс для синтаксических ошибок, связанных с неправильным отступом. Это подкласс класса
SyntaxError
.
-
exception
TabError
¶ -
Возникает, когда отступ содержит непоследовательное использование табуляции и пробелов. Это подкласс
IndentationError
.
-
exception
SystemError
¶ -
Возникает, когда интерпретатор обнаруживает внутреннюю ошибку, но ситуация не выглядит настолько серьезной, чтобы оставить все надежды. Связанное значение — это строка, указывающая на то, что пошло не так (в низкоуровневых терминах).
Вы должны сообщить об этом автору или сопровождающему вашего интерпретатора Python. Обязательно сообщите версию интерпретатора Python (
sys.version
; она также выводится в начале интерактивной сессии Python), точное сообщение об ошибке (ассоциированное значение исключения) и, если возможно, источник программы, вызвавшей ошибку.
-
exception
SystemExit
¶ -
Это исключение вызывается функцией
sys.exit()
. Оно наследуется отBaseException
вместоException
, чтобы оно не было случайно поймано кодом, который ловитException
. Это позволяет исключению правильно распространиться вверх и вызвать выход интерпретатора. Если исключение не обрабатывается, интерпретатор Python завершает работу; отслеживание стека не печатается. Конструктор принимает тот же необязательный аргумент, который передается вsys.exit()
. Если значение целое, то оно определяет статус выхода системы (передается в функцию Сиexit()
); еслиNone
, то статус выхода равен нулю; если имеет другой тип (например, строка), то печатается значение объекта и статус выхода равен единице.Вызов
sys.exit()
преобразуется в исключение, чтобы обработчики очистки (finally
пункты операторовtry
) могли быть выполнены, и чтобы отладчик мог выполнить сценарий без риска потери управления. Функцияos._exit()
может быть использована в случае абсолютной необходимости немедленного выхода (например, в дочернем процессе после вызоваos.fork()
).-
code
¶ -
Статус выхода или сообщение об ошибке, которое передается в конструктор. (По умолчанию
None
).
-
-
exception
TypeError
¶ -
Возникает, когда операция или функция применяется к объекту несоответствующего типа. Связанное значение — это строка, содержащая подробную информацию о несоответствии типа.
Это исключение может быть вызвано пользовательским кодом, чтобы указать, что попытка выполнения операции над объектом не поддерживается и не предполагается. Если объект должен поддерживать данную операцию, но еще не предоставил ее реализацию, то правильным исключением будет
NotImplementedError
.Передача аргументов неправильного типа (например, передача
list
, когда ожидаетсяint
) должна привести к ошибкеTypeError
, а передача аргументов с неправильным значением (например, число за пределами ожидаемых границ) должна привести к ошибкеValueError
.
-
exception
UnboundLocalError
¶ -
Возникает, когда в функции или методе делается ссылка на локальную переменную, но значение не было привязано к этой переменной. Это подкласс
NameError
.
-
exception
UnicodeError
¶ -
Вызывается при возникновении ошибки кодирования или декодирования, связанной с Unicode. Является подклассом
ValueError
.UnicodeError
имеет атрибуты, которые описывают ошибку кодирования или декодирования. Например,err.object[err.start:err.end]
указывает конкретный недопустимый вход, на котором кодек не справился.-
encoding
¶ -
Имя кодировки, вызвавшей ошибку.
-
reason
¶ -
Строка, описывающая конкретную ошибку кодека.
-
object
¶ -
Объект, который кодек пытался закодировать или декодировать.
-
start
¶ -
Первый индекс недопустимых данных в
object
.
-
end
¶ -
Индекс после последних недопустимых данных в
object
.
-
-
exception
UnicodeEncodeError
¶ -
Возбуждается, когда во время кодирования возникает ошибка, связанная с Unicode. Является подклассом
UnicodeError
.
-
exception
UnicodeDecodeError
¶ -
Возбуждается, когда во время декодирования возникает ошибка, связанная с Unicode. Является подклассом
UnicodeError
.
-
exception
UnicodeTranslateError
¶ -
Возбуждается, когда при переводе возникает ошибка, связанная с Unicode. Является подклассом
UnicodeError
.
-
exception
ValueError
¶ -
Возникает, когда операция или функция получает аргумент, имеющий правильный тип, но несоответствующее значение, и ситуация не описывается более точным исключением, таким как
IndexError
.
-
exception
ZeroDivisionError
¶ -
Возникает, когда второй аргумент операции деления или модуляции равен нулю. Связанное значение представляет собой строку, указывающую тип операндов и операции.
Следующие исключения сохранены для совместимости с предыдущими версиями; начиная с Python 3.3, они являются псевдонимами OSError
.
-
exception
EnvironmentError
¶
-
exception
IOError
¶
-
exception
WindowsError
¶ -
Доступно только в Windows.
Исключения в ОС¶
Следующие исключения являются подклассами OSError
, они вызываются в зависимости от кода системной ошибки.
-
exception
BlockingIOError
¶ -
Возникает, когда операция блокирует объект (например, сокет), настроенный на неблокирующую операцию. Соответствует
errno
EAGAIN
,EALREADY
,EWOULDBLOCK
иEINPROGRESS
.В дополнение к атрибутам
OSError
,BlockingIOError
может иметь еще один атрибут:-
characters_written
¶ -
Целое число, содержащее количество символов, записанных в поток до его блокировки. Этот атрибут доступен при использовании классов буферизованного ввода-вывода из модуля
io
.
-
-
exception
ChildProcessError
¶ -
Возникает при неудачной операции над дочерним процессом. Соответствует
errno
ECHILD
.
-
exception
ConnectionError
¶ -
Базовый класс для вопросов, связанных с подключением.
Подклассами являются
BrokenPipeError
,ConnectionAbortedError
,ConnectionRefusedError
иConnectionResetError
.
-
exception
BrokenPipeError
¶ -
Подкласс
ConnectionError
, возникает при попытке записи на трубу, в то время как другой конец был закрыт, или при попытке записи на сокет, который был закрыт для записи. Соответствуетerrno
EPIPE
иESHUTDOWN
.
-
exception
ConnectionAbortedError
¶ -
Подкласс
ConnectionError
, возникающий, когда попытка соединения прерывается одноранговым узлом. Соответствуетerrno
ECONNABORTED
.
-
exception
ConnectionRefusedError
¶ -
Подкласс
ConnectionError
, вызываемый, когда попытка соединения отвергается пиром. Соответствуетerrno
ECONNREFUSED
.
-
exception
ConnectionResetError
¶ -
Подкласс
ConnectionError
, вызываемый, когда соединение сбрасывается peer’ом. Соответствуетerrno
ECONNRESET
.
-
exception
FileExistsError
¶ -
Возникает при попытке создать файл или каталог, который уже существует. Соответствует
errno
EEXIST
.
-
exception
FileNotFoundError
¶ -
Возникает, когда запрашивается файл или каталог, но он не существует. Соответствует
errno
ENOENT
.
-
exception
InterruptedError
¶ -
Возникает, когда системный вызов прерывается входящим сигналом. Соответствует
errno
EINTR
.Изменено в версии 3.5: Python теперь повторяет системные вызовы, когда вызов syscall прерывается сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо того, чтобы вызывать
InterruptedError
.
-
exception
IsADirectoryError
¶ -
Возникает при запросе файловой операции (например,
os.remove()
) над каталогом. Соответствуетerrno
EISDIR
.
-
exception
NotADirectoryError
¶ -
Возникает, когда операция с каталогом (например,
os.listdir()
) запрашивается для чего-то, что не является каталогом. На большинстве платформ POSIX он также может быть вызван, если операция пытается открыть или перейти к файлу, не являющемуся каталогом, как если бы это был каталог. Соответствуетerrno
ENOTDIR
.
-
exception
PermissionError
¶ -
Возникает при попытке выполнить операцию без соответствующих прав доступа — например, прав доступа к файловой системе. Соответствует
errno
EACCES
иEPERM
.
-
exception
ProcessLookupError
¶ -
Возникает, когда данный процесс не существует. Соответствует
errno
ESRCH
.
-
exception
TimeoutError
¶ -
Возникает, когда системная функция завершается по таймеру на системном уровне. Соответствует
errno
ETIMEDOUT
.
Добавлено в версии 3.3: Были добавлены все вышеперечисленные подклассы OSError
.
См.также
PEP 3151 — Переработка иерархии исключений ОС и IO
Предупреждения¶
Следующие исключения используются в качестве категорий предупреждений; подробнее см. документацию Предупреждающие категории.
-
exception
Warning
¶ -
Базовый класс для категорий предупреждений.
-
exception
UserWarning
¶ -
Базовый класс для предупреждений, генерируемых пользовательским кодом.
-
exception
DeprecationWarning
¶ -
Базовый класс для предупреждений об устаревших функциях, когда эти предупреждения предназначены для других разработчиков Python.
Игнорируется фильтрами предупреждений по умолчанию, кроме модуля
__main__
(PEP 565). Включение Python Development Mode показывает это предупреждение.Политика обесценивания описана в PEP 387.
-
exception
PendingDeprecationWarning
¶ -
Базовый класс для предупреждений о функциях, которые устарели и должны быть устаревшими в будущем, но не являются устаревшими на данный момент.
Этот класс используется редко, поскольку выдавать предупреждение о возможном предстоящем обесценивании необычно, а
DeprecationWarning
предпочтительнее для уже действующих обесцениваний.Игнорируется фильтрами предупреждений по умолчанию. Включение Python Development Mode показывает это предупреждение.
Политика обесценивания описана в PEP 387.
-
exception
SyntaxWarning
¶ -
Базовый класс для предупреждений о сомнительном синтаксисе.
-
exception
RuntimeWarning
¶ -
Базовый класс для предупреждений о сомнительном поведении во время выполнения.
-
exception
FutureWarning
¶ -
Базовый класс для предупреждений об устаревших функциях, когда эти предупреждения предназначены для конечных пользователей приложений, написанных на Python.
-
exception
ImportWarning
¶ -
Базовый класс для предупреждений о вероятных ошибках в импорте модулей.
Игнорируется фильтрами предупреждений по умолчанию. Включение Python Development Mode показывает это предупреждение.
-
exception
UnicodeWarning
¶ -
Базовый класс для предупреждений, связанных с Unicode.
-
exception
EncodingWarning
¶ -
Базовый класс для предупреждений, связанных с кодировками.
Подробнее см. в разделе Кодирование по желаниюПредупреждение.
Добавлено в версии 3.10.
-
exception
BytesWarning
¶ -
Базовый класс для предупреждений, связанных с
bytes
иbytearray
.
-
exception
ResourceWarning
¶ -
Базовый класс для предупреждений, связанных с использованием ресурсов.
Игнорируется фильтрами предупреждений по умолчанию. Включение Python Development Mode показывает это предупреждение.
Добавлено в версии 3.2.
Иерархия исключений¶
Иерархия классов для встроенных исключений такова:
BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StopAsyncIteration +-- ArithmeticError | +-- FloatingPointError | +-- OverflowError | +-- ZeroDivisionError +-- AssertionError +-- AttributeError +-- BufferError +-- EOFError +-- ImportError | +-- ModuleNotFoundError +-- LookupError | +-- IndexError | +-- KeyError +-- MemoryError +-- NameError | +-- UnboundLocalError +-- OSError | +-- BlockingIOError | +-- ChildProcessError | +-- ConnectionError | | +-- BrokenPipeError | | +-- ConnectionAbortedError | | +-- ConnectionRefusedError | | +-- ConnectionResetError | +-- FileExistsError | +-- FileNotFoundError | +-- InterruptedError | +-- IsADirectoryError | +-- NotADirectoryError | +-- PermissionError | +-- ProcessLookupError | +-- TimeoutError +-- ReferenceError +-- RuntimeError | +-- NotImplementedError | +-- RecursionError +-- SyntaxError | +-- IndentationError | +-- TabError +-- SystemError +-- TypeError +-- ValueError | +-- UnicodeError | +-- UnicodeDecodeError | +-- UnicodeEncodeError | +-- UnicodeTranslateError +-- Warning +-- DeprecationWarning +-- PendingDeprecationWarning +-- RuntimeWarning +-- SyntaxWarning +-- UserWarning +-- FutureWarning +-- ImportWarning +-- UnicodeWarning +-- BytesWarning +-- EncodingWarning +-- ResourceWarning
Следующие исключения являются подклассами OSError
, они возникают в зависимости от кода системной ошибки.
-
exception BlockingIOError
-
Возникает, когда операция блокирует объект (например, сокет), установленный для неблокирующей операции. Соответствует
errno
EAGAIN
,EALREADY
,EWOULDBLOCK
иEINPROGRESS
.В дополнение к свойствам
OSError
BlockingIOError
может иметь еще один атрибут:-
characters_written
-
Целое число, содержащее количество символов, записанных в поток до его блокировки. Этот атрибут доступен при использовании классов буферизованного ввода-вывода из модуля
io
.
-
-
exception ChildProcessError
-
Возникает при сбое операции над дочерним процессом. Соответствует
ECHILD
errno
.
-
exception ConnectionError
-
Базовый класс для вопросов,связанных с соединениями.
Подклассами являются
BrokenPipeError
,ConnectionAbortedError
,ConnectionRefusedError
иConnectionResetError
.
-
exception BrokenPipeError
-
Подкласс
ConnectionError
, возникающий при попытке записи в канал, в то время как другой конец был закрыт, или при попытке записи в сокет, который был отключен для записи. Соответствуетerrno
EPIPE
иESHUTDOWN
.
-
exception ConnectionAbortedError
-
Подкласс
ConnectionError
, возникающий, когда попытка подключения прерывается узлом. СоответствуетECONNABORTED
errno
.
-
exception ConnectionRefusedError
-
Подкласс
ConnectionError
, который возникает, когда одноранговый узел отклоняет попытку подключения. Соответствуетerrno
ECONNREFUSED
.
-
exception ConnectionResetError
-
Подкласс
ConnectionError
, возникающий, когда соединение сбрасывается узлом. СоответствуетECONNRESET
errno
.
-
exception FileExistsError
-
Возникает при попытке создать файл или каталог, который уже существует. Соответствует
errno
EEXIST
.
-
exception FileNotFoundError
-
Возникает, когда запрашивается файл или каталог, но он не существует. Соответствует
errno
ENOENT
.
-
exception InterruptedError
-
Возникает, когда системный вызов прерывается входящим сигналом. Соответствует
errno
EINTR
.Изменено в версии 3.5: Python теперь повторяет системные вызовы, когда системный вызов прерывается сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение ( обоснование см. в PEP 475 ), вместо того, чтобы вызывать
InterruptedError
.
-
exception IsADirectoryError
-
Возникает, когда файловая операция (например,
os.remove()
) запрашивается в каталоге. Соответствуетerrno
EISDIR
.
-
exception NotADirectoryError
-
Возникает, когда операция каталога (например,
os.listdir()
) запрашивается для чего-то, что не является каталогом. На большинстве платформ POSIX он также может возникнуть, если операция пытается открыть или просмотреть файл, не являющийся каталогом, как если бы он был каталогом. Соответствуетerrno
ENOTDIR
.
-
exception PermissionError
-
Возникает при попытке запустить операцию без соответствующих прав доступа — например, разрешений файловой системы. Соответствует
errno
EACCES
,EPERM
иENOTCAPABLE
.
-
exception ProcessLookupError
-
Возникает, когда данный процесс не существует. Соответствует
errno
ESRCH
.
-
exception TimeoutError
-
Возникает, когда время ожидания системной функции на системном уровне истекло. Соответствует
errno
ETIMEDOUT
.
Новое в версии 3.3: добавлены все вышеперечисленные подклассы OSError
.
See also
PEP 3151 — Переработка иерархии исключений ОС и ввода-вывода
Warnings
Следующие исключения используются в качестве категорий предупреждений; см. документацию по категориям предупреждений для получения более подробной информации.
-
exception Warning
-
Базовый класс для категорий предупреждений.
-
exception UserWarning
-
Базовый класс для предупреждений,выдаваемых пользовательским кодом.
-
exception DeprecationWarning
-
Базовый класс для предупреждений об устаревших возможностях,когда эти предупреждения предназначены для других разработчиков Python.
Игнорируется фильтрами предупреждений по умолчанию, за исключением модуля
__main__
(PEP 565 ). Включение режима разработки Python показывает это предупреждение.Политика устаревания описана в PEP 387 .
-
exception PendingDeprecationWarning
-
Базовый класс для предупреждений об устаревших и ожидаемых в будущем функциях,но не устаревших на данный момент.
Этот класс редко используется, так как выдача предупреждения о возможном предстоящем устаревании является необычной, а
DeprecationWarning
предпочтительнее для уже активных устареваний.Игнорируется фильтрами предупреждений по умолчанию. При включении режима разработки Python отображается это предупреждение.
Политика устаревания описана в PEP 387 .
-
exception SyntaxWarning
-
Базовый класс для предупреждений о сомнительном синтаксисе.
-
exception RuntimeWarning
-
Базовый класс для предупреждений о сомнительном поведении во время выполнения.
-
exception FutureWarning
-
Базовый класс для предупреждений об устаревших функциях,когда эти предупреждения предназначены для конечных пользователей приложений,написанных на Python.
-
exception ImportWarning
-
Базовый класс для предупреждений о возможных ошибках при импорте модулей.
Игнорируется фильтрами предупреждений по умолчанию. При включении режима разработки Python отображается это предупреждение.
-
exception UnicodeWarning
-
Базовый класс для предупреждений,связанных с Юникодом.
-
exception EncodingWarning
-
Базовый класс для предупреждений,связанных с кодировками.
См. Подробности в разделе « Предупреждение о включении кодирования» .
Новинка в версии 3.10.
-
exception BytesWarning
-
Базовый класс для предупреждений, связанных с
bytes
иbytearray
.
-
exception ResourceWarning
-
Базовый класс для предупреждений,связанных с использованием ресурсов.
Игнорируется фильтрами предупреждений по умолчанию. При включении режима разработки Python отображается это предупреждение.
Новинка в версии 3.2.
Exception groups
Следующие используются, когда необходимо вызвать несколько несвязанных исключений. Они являются частью иерархии исключений, поэтому их можно обрабатывать с except
, как и со всеми другими исключениями. Кроме того, они распознаются с помощью except*
, который сопоставляет их подгруппы на основе типов содержащихся исключений.
-
exception ExceptionGroup(msg, excs)
-
exception BaseExceptionGroup(msg, excs)
-
Оба этих типа исключений оборачивают исключения в последовательность
excs
. Параметрmsg
должен быть строкой. Разница между этими двумя классами заключается в том, чтоBaseExceptionGroup
расширяетBaseException
и может обернуть любое исключение, аExceptionGroup
расширяетException
и может обернуть только подклассыException
. Этот дизайн таков, что excludeexcept Exception
перехватываетExceptionGroup
, но неBaseExceptionGroup
.Конструктор
BaseExceptionGroup
возвращаетExceptionGroup
, а неBaseExceptionGroup
, если все содержащиеся исключения являются экземплярамиException
, поэтому его можно использовать для автоматического выбора. КонструкторExceptionGroup
, с другой стороны, вызываетTypeError
, если какое-либо содержащееся исключение не является подклассомException
.-
message
-
Аргумент
msg
для конструктора. Это атрибут только для чтения.
-
exceptions
-
Кортеж исключений в последовательности
excs
, передаваемой конструктору. Это атрибут только для чтения.
-
subgroup(condition)
-
Возвращает группу исключений, содержащую только те исключения из текущей группы, которые соответствуют условию , или
None
, если результат пуст.Условие может быть либо функцией, которая принимает исключение и возвращает true для тех, которые должны быть в подгруппе, либо может быть типом исключения или кортежем типов исключений, который используется для проверки на совпадение с помощью той же проверки, что и используется в предложении
except
.Структура вложенности текущего исключения сохраняется в результате, как и значения его полей
message
,__traceback__
,__cause__
,__context__
и__notes__
. Пустые вложенные группы исключаются из результата.Условие проверяется для всех исключений во вложенной группе исключений,включая группу верхнего уровня и любые вложенные группы исключений.Если условие истинно для такой группы исключений,она включается в результат полностью.
-
split(condition)
-
Подобно
subgroup()
, но возвращает пару(match, rest)
гдеmatch
— этоsubgroup(condition)
, аrest
— оставшаяся несовпадающая часть.
-
derive(excs)
-
Возвращает группу исключений с тем же
message
,__traceback__
,__cause__
,__context__
и__notes__
, но с оберткой исключений вexcs
.Этот метод используется функциями
subgroup()
иsplit()
. Подкласс должен переопределить его, чтобыsubgroup()
иsplit()
возвращали экземпляры подкласса, а неExceptionGroup
.>>> class MyGroup(ExceptionGroup): ... def derive(self, exc): ... return MyGroup(self.message, exc) ... >>> MyGroup("eg", [ValueError(1), TypeError(2)]).split(TypeError) (MyGroup('eg', [TypeError(2)]), MyGroup('eg', [ValueError(1)]))
Обратите внимание, что
BaseExceptionGroup
определяет__new__()
, поэтому подклассы, которым нужна другая сигнатура конструктора, должны переопределить ее, а не__init__()
. Например, следующее определяет подкласс группы исключений, который принимает код выхода и создает из него сообщение группы.class Errors(ExceptionGroup): def __new__(cls, errors, exit_code): self = super().__new__(Errors, f"exit code: {exit_code}", errors) self.exit_code = exit_code return self def derive(self, excs): return Errors(excs, self.exit_code)
Новинка в версии 3.11.
-
Exception hierarchy
Иерархия классов для встроенных исключений:
BaseException ├── BaseExceptionGroup ├── GeneratorExit ├── KeyboardInterrupt ├── SystemExit └── Exception ├── ArithmeticError │ ├── FloatingPointError │ ├── OverflowError │ └── ZeroDivisionError ├── AssertionError ├── AttributeError ├── BufferError ├── EOFError ├── ExceptionGroup [BaseExceptionGroup] ├── ImportError │ └── ModuleNotFoundError ├── LookupError │ ├── IndexError │ └── KeyError ├── MemoryError ├── NameError │ └── UnboundLocalError ├── OSError │ ├── BlockingIOError │ ├── ChildProcessError │ ├── ConnectionError │ │ ├── BrokenPipeError │ │ ├── ConnectionAbortedError │ │ ├── ConnectionRefusedError │ │ └── ConnectionResetError │ ├── FileExistsError │ ├── FileNotFoundError │ ├── InterruptedError │ ├── IsADirectoryError │ ├── NotADirectoryError │ ├── PermissionError │ ├── ProcessLookupError │ └── TimeoutError ├── ReferenceError ├── RuntimeError │ ├── NotImplementedError │ └── RecursionError ├── StopAsyncIteration ├── StopIteration ├── SyntaxError │ └── IndentationError │ └── TabError ├── SystemError ├── TypeError ├── ValueError │ └── UnicodeError │ ├── UnicodeDecodeError │ ├── UnicodeEncodeError │ └── UnicodeTranslateError └── Warning ├── BytesWarning ├── DeprecationWarning ├── EncodingWarning ├── FutureWarning ├── ImportWarning ├── PendingDeprecationWarning ├── ResourceWarning ├── RuntimeWarning ├── SyntaxWarning ├── UnicodeWarning └── UserWarning
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/exceptions.html
Python
3.11
-
errno-Стандартные символы системы errno
Этот модуль делает доступными стандартные символы системы errno.
-
Built-in Exceptions
В Python все исключения должны быть экземплярами класса,производного от BaseException.
-
faulthandler-сбросить отслеживание Python
Новинка в версии 3.3.
-
fcntl-Системные вызовы fcntl и ioctl
Этот модуль выполняет управление файлами и дескрипторами ввода/вывода.
Python предоставляет две очень важные функции, чтобы справиться с любой неожиданной ошибкой в программах на языке Python и добавить возможности их отладки:
- Обработка исключений — Будет охвачена в этом руководстве. Список стандартных исключений, доступных в Python будет рассмотрен здесь.
- Утверждения — Будет рассмотрено в учебнике об утверждениях в Python 3.
Стандартные исключения
Ниже приведен список стандартных исключений доступных в Python:
№ | Имя и Описание исключений |
---|---|
1 | Exception — Базовый класс для всех исключений |
2 | StopIteration — Возникает, когда метод next() цикла не указывает на какой-либо объект. |
3 | SystemExit — Вызываемая функция sys.exit(). |
4 | StandardError — Базовый класс для всех встроенных исключений, кроме StopIteration и SystemExit. |
5 | ArithmeticError — Базовый класс для всех ошибок, которые возникают для числовых расчетов. |
6 | OverflowError — Возникает, когда значение превышает максимальный предел для числового типа. |
7 | FloatingPointError — Возникает, когда расчет с плавающей точкой терпит неудачу. |
8 | ZeroDivisonError — Возникает при делении или по модулю нуля, имеет место для всех числовых типов. |
9 | AssertionError — Вызывается в случае выхода из строя заявления Assert. |
10 | AttributeError — Вызывается в случае выхода из строя ссылки на атрибут или назначения. |
11 | EOFError — Возникает, когда нет входного сигнала либо из raw_input () или функции inpud() и достигнут конец файла. |
12 | ImportError — Возникает, когда оператор import терпит неудачу. |
13 | KeyboardInterrupt — Возникает, когда пользователь прерывает выполнение программы, как правило, нажав Ctrl + C. |
14 | LookupError — Базовый класс для всех ошибок поиска. |
15 | IndexError — Возникает, когда индекс не найден в последовательности. |
16 | KeyError — Возникает, когда указанный ключ не найден в словаре. |
17 | NameError — Возникает, когда идентификатор не найден в локальных или глобальном пространстве имен. |
18 | UnboundLocalError — Возникает при попытке доступа к локальной переменной в функции или метода, но значение не было присвоено. |
19 | EnvironmentError — Базовый класс для всех исключений, которые происходят за пределами среды Python. |
20 | IOError — Возникает, когда операция ввода/вывода не работает, например, заявление для печати или функции Open() при попытке открыть файл, который не существует. |
21 | OSError — Вызывает ошибку, связанную с операционной системой. |
22 | SyntaxError — Возникает, когда есть ошибка в синтаксисе Python. |
23 | IndentationError — Возникает, когда не указаны правильно отступы. |
24 | SystemError — Возникает, когда интерпретатор находит внутреннюю проблему, но при возникновении этой ошибки интерпретатор Python не выходит. |
25 | SystemExit — Вызывается, когда интерпретатор Python выходит с помощью sys.функции exit(). Если код не обработан, переводчик завершает работу. |
26 | TypeError — Возникает при попытке операции или функции, недопустимой для указанного типа данных. |
27 | ValueError — Возникает, когда встроенная функция для типа данных имеет допустимый тип аргументов, но аргументы имеют недопустимые значения. |
28 | RuntimeError — Возникает, когда генерируется ошибка не попадающая ни в какую категорию. |
29 | NotImplementedError — Возникает, когда абстрактный метод, который должен быть реализован у унаследованного класса фактически не реализуется. |
Утверждения в Python
Утверждение является осознанной проверкой, которую вы можете включить или выключить, когда вы проводите тестирование программы.
- Самый простой способ создать утверждение, является приравнять его к заявление raise-if (или быть более точным, заявление raise-if-not). Выражение проверяется, и если результат приходит ложным, возбуждается исключение.
- Утверждения выполняются оператором assert, новейшим ключевым словом Python, введенным в версии 1.5.
- Программисты часто размещают утверждения в начале функции для проверки допустимого ввода и после вызова функции для проверки допустимого вывода.
Заявление assert
Когда встречается оператор assert, Python оценивает сопровождающие выражение, которое, мы надеемся, верно. Если выражение ложно, Python вызывает исключение AssertionError.
Синтаксис assert:
assert Expression[, Аргументы]
Если утверждение не удается, Python использует ArgumentExpression в качестве аргумента для AssertionError. Исключение AssertionError может быть перехвачено и обработано, как и любое другое исключение, используя заявление try-except. Если они не обработаны, они завершат программу и произведут обратную трассировку.
Пример
Вот функция, которая преобразует заданную температуру от градусов Кельвина до градусов по Фаренгейту. Так как 0° К это абсолютный 0, то получается, что функция вываливается, если он видит отрицательную температуру:
#!/usr/bin/python3 def KelvinToFahrenheit(Temperature): assert (Temperature >= 0),"Холоднее абсолютного нуля!" return ((Temperature-273)*1.8)+32 print (KelvinToFahrenheit(273)) print (int(KelvinToFahrenheit(505.78))) print (KelvinToFahrenheit(-5))
Когда этот код выполниться, он выдаст следующий результат:
32.0 451 Traceback (most recent call last): File "test.py", line 9, in <module> print KelvinToFahrenheit(-5) File "test.py", line 4, in KelvinToFahrenheit assert (Temperature >= 0),"Холоднее абсолютного нуля!" AssertionError: Холоднее абсолютного нуля!
Что такое исключение?
Исключением является событие, которое происходит во время выполнения программы, когда нарушается нормальный поток команд в программе. В общем случае, когда сценарий Python сталкивается с ситуацией, что он не может справиться с ним, он вызывает исключение. Исключение представляет собой объект Python, который представляет ошибку.
Когда сценарий Python вызывает исключение, он должен либо обработать исключение, сразу же, в противном случае он прекращает свою работу и завершает работу.
Обработка исключения
Если у вас есть какой-то подозрительный код, который может вызвать исключение, вы можете защитить свою программу путем размещения подозрительного кода в блоке try:. Блок try: включает в себя, заявление except:, следует блок кода, который обрабатывает проблему как можно элегантнее.
Синтаксис
Вот простой синтаксис блоков try….except…else:
try: Вы делаете свою работу ...................... except ExceptionI: Если есть ExceptionI, то выполняется этот блок. except ExceptionII: Если есть ExceptionII, то выполняется этот блок. ...................... else: Если исключений нет, выполняется этот блок.
Вот несколько важных моментов, о вышеупомянутом синтаксисе:
- Один оператор может попытаться иметь несколько заявлений. Это полезно, когда блок попытка содержит заявления, которые могут бросить различные типы исключений.
- Кроме того, можно предоставить универсальное предложение, которое обрабатывает любое исключение.
- После класса except, можно добавить класс else. Код else-block выполниться, если код в блоке try: не вызывает исключение.
- else-block является хорошим местом для кода, который не нужно попробовать: защита блока.
Пример
Этот пример открывает файл, записывает содержимое в файл и выходит корректно, потому что нет никаких проблем:
#!/usr/bin/python3 try: fh = open("testfile", "w") fh.write("Это мой тестовый файл для обработки исключений!!") except IOError: print ("Ошибка: не удается найти файл или прочитать данные") else: print ("Запись содержимого в файл произведена успешно") fh.close()
Данный код выдаст следующий результат:
Запись содержимого в файл произведена успешно
Пример
В этом примере попытаемся открыть файл, в котором у вас нет разрешения на запись, поэтому он вызывает исключение:
#!/usr/bin/python3 try: fh = open("testfile", "r") fh.write("Это мой тестовый файл для обработки исключений!!") except IOError: print ("Ошибка: не удается найти файл или прочитать данные") else: print ("Запись содержимого в файл произведена успешно")
Данный код выдаст следующий результат:
Ошибка: не удается найти файл или прочитать данные
Класс except без исключений
Вы можете также использовать заявление except без каких-либо исключений, определенных следующим образом:
try: Вы делаете свою работу ...................... except: Если есть какие-либо исключения, то выполняется этого блока. ...................... else: Если исключений нет, выполняется этот блок.
Этот вид заявления try-except перехватывает все исключения, которые происходят. Использование такого рода заявления try-except, не считается хорошей практикой программирования, потому что она ловит все исключения, но не дает программисту определить основную причину проблемы, которая может возникнуть.
Класс except с несколькими исключениями
Вы также можете использовать заявление except, для обработки нескольких исключений следующим образом:
try: Вы делаете свою работу ...................... except(Exception1[, Exception2[,...ExceptionN]]]): Если есть какое-либо исключение из данного списка исключений, то выполняется этот блок. ...................... else: Если исключений нет, выполняется этот блок.
Класс try-finally
Вы можете использовать блок finally: вместе с блоком try:. Блок finally: представляет собой место, куда можно поместить любой код, который должен выполнится, вызовет ли блок try исключение или нет. Синтаксис заявление try-finally следующий:
try: Вы делаете свою работу; ...................... Из-за каких-либо исключений, это может быть пропущено. finally: Это всегда будет исполнено. ......................
Примечание:
Вы можете указать за предложением except или классом finally, но не оба. Нельзя использовать предложение else вместе с предложением finally.
Пример
#!/usr/bin/python3 try: fh = open("testfile", "w") fh.write("Это мой тестовый файл для обработки исключений!!") finally: print ("Ошибка: не удается найти файл или прочитать данные") fh.close()
Если у вас нет разрешения на открытие файла в режиме записи, то это приведет к следующему результату:
Ошибка: не удается найти файл или прочитать данные
Тот же пример можно записать более аккуратно следующим образом:
#!/usr/bin/python3 try: fh = open("testfile", "w") try: fh.write("Это мой тестовый файл для обработки исключений!!") finally: print ("Собираюсь закрыть файл") fh.close() except IOError: print ("Ошибка: не удается найти файл или прочитать данные")
Когда исключение в блоке try выполниться, немедленно переходит к блоку finally. После того как все операторы в блоке finally выполнятся, то возбуждается исключение снова и обрабатывается заявление except, если присутствует в следующем более высокого уровня заявление try-except.
Аргумент в исключении
Исключение может иметь argument, который является значением, которое дает дополнительную информацию о проблеме. Содержание аргумента зависит от исключения. Вы фиксируете аргумент исключения, предоставляя переменную в предложении except следующим образом:
try: Вы делаете свою работу ...................... except ExceptionType as Argument: Значение аргумента можно напечатать здесь...
Если вы пишете код для обработки исключения, вы можете указать переменную, следующую за именем исключения в предложении except. Если вы перехватываете несколько исключений, вы можете иметь переменную в виде кортежа с исключениями.
Эта переменная получает значение исключения, в основном содержащего причину исключения. Переменная может получать одно или несколько значений в виде кортежа. Этот кортеж обычно содержит строку ошибки, номер ошибки и расположение ошибки.
Пример
Ниже приведен пример для одного исключения:
#!/usr/bin/python3 # Определить функцию. def temp_convert(var): try: return int(var) except ValueError as Argument: print ("Аргумент не содержит чиселn", Argument) # Вызов функции выше здесь. temp_convert("xyz")
Данный код выдаст следующий результат:
Аргумент не содержит чисел invalid literal for int() with base 10: 'xyz'
Исключение raise
Вы можете вызвать исключения несколькими способами, используя оператор raise. Общий синтаксис для заявления raise выглядит следующим образом:
Синтаксис
raise [Exception [, args [, traceback]]]
Здесь Exception представляет собой тип исключения (например, NameError) и arg является значением для аргумента исключения. Аргумент является необязательным; если не прилагается, аргумента в исключении нет.
Последний аргумент, отслеживающий, также является необязательным (и редко используется на практике), и если он присутствует, отслеживающий объект используется для исключения.
Пример
Исключением может быть строка, класс или объект. Большинство исключений, создаваемых ядром Python, являются классами с аргументом, который является экземпляром класса. Определение новых исключений довольно легко и может быть сделано следующим образом:
def functionName( level ): if level <1: raise Exception(level) # Приведенный ниже код не будет выполнен # если мы вызовем исключение return level
Примечание:
Для того, чтобы поймать исключение, заявление «except» должно ссылаться на то же исключение, указанное либо как объект класса или простую строку.
Например, чтобы захватить исключение выше, мы должны написать пункт except следующим образом:
try: Бизнес-логика здесь... except Exception as e: Обработка исключений здесь e.args... else: Остальная часть кода здесь...
Следующий пример иллюстрирует использование средств исключения:
#!/usr/bin/python3 def functionName( level ): if level <1: raise Exception(level) # Приведенный ниже код не будет выполнен # если мы вызовем исключение return level try: l = functionName(-10) print ("level = ",l) except Exception as e: print ("ошибка в аргументе уровня",e.args[0])
Это выдаст следующий результат:
ошибка в аргументе уровня -10
Исключения определенные пользователем
Python также позволяет создавать свои собственные исключения путем вывода классов из стандартных встроенных исключений.
Вот пример, связанный с RuntimeError. Здесь, создается класс, как подкласс RuntimeError. Это полезно, когда вам нужно отобразить более конкретную информацию при перехвате исключения.
В блоке try , определенный пользователем возбуждаются исключение и ловится за блоком except. Переменная е используются для создания экземпляра класса NetworkError.
class Networkerror(RuntimeError): def __init__(self, arg): self.args = arg
Поэтому, как только вы определили класс выше, вы можете вызвать исключение следующим образом:
try: raise Networkerror("Плохое имя хоста") except Networkerror,e: print e.args
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.