Обработка ошибок увеличивает отказоустойчивость кода, защищая его от потенциальных сбоев, которые могут привести к преждевременному завершению работы.
Прежде чем переходить к обсуждению того, почему обработка исключений так важна, и рассматривать встроенные в Python исключения, важно понять, что есть тонкая грань между понятиями ошибки и исключения.
Ошибку нельзя обработать, а исключения Python обрабатываются при выполнении программы. Ошибка может быть синтаксической, но существует и много видов исключений, которые возникают при выполнении и не останавливают программу сразу же. Ошибка может указывать на критические проблемы, которые приложение и не должно перехватывать, а исключения — состояния, которые стоит попробовать перехватить. Ошибки — вид непроверяемых и невозвратимых ошибок, таких как OutOfMemoryError
, которые не стоит пытаться обработать.
Обработка исключений делает код более отказоустойчивым и помогает предотвращать потенциальные проблемы, которые могут привести к преждевременной остановке выполнения. Представьте код, который готов к развертыванию, но все равно прекращает работу из-за исключения. Клиент такой не примет, поэтому стоит заранее обработать конкретные исключения, чтобы избежать неразберихи.
Ошибки могут быть разных видов:
- Синтаксические
- Недостаточно памяти
- Ошибки рекурсии
- Исключения
Разберем их по очереди.
Синтаксические ошибки (SyntaxError)
Синтаксические ошибки часто называют ошибками разбора. Они возникают, когда интерпретатор обнаруживает синтаксическую проблему в коде.
Рассмотрим на примере.
a = 8
b = 10
c = a b
File "<ipython-input-8-3b3ffcedf995>", line 3
c = a b
^
SyntaxError: invalid syntax
Стрелка вверху указывает на место, где интерпретатор получил ошибку при попытке исполнения. Знак перед стрелкой указывает на причину проблемы. Для устранения таких фундаментальных ошибок Python будет делать большую часть работы за программиста, выводя название файла и номер строки, где была обнаружена ошибка.
Недостаточно памяти (OutofMemoryError)
Ошибки памяти чаще всего связаны с оперативной памятью компьютера и относятся к структуре данных под названием “Куча” (heap
). Если есть крупные объекты (или) ссылки на подобные, то с большой долей вероятности возникнет ошибка OutofMemory
. Она может появиться по нескольким причинам:
- Использование 32-битной архитектуры Python (максимальный объем выделенной памяти невысокий, между 2 и 4 ГБ);
- Загрузка файла большого размера;
- Запуск модели машинного обучения/глубокого обучения и много другое;
Обработать ошибку памяти можно с помощью обработки исключений — резервного исключения. Оно используется, когда у интерпретатора заканчивается память и он должен немедленно остановить текущее исполнение. В редких случаях Python вызывает OutofMemoryError
, позволяя скрипту каким-то образом перехватить самого себя, остановить ошибку памяти и восстановиться.
Но поскольку Python использует архитектуру управления памятью из языка C (функция malloc()
), не факт, что все процессы восстановятся — в некоторых случаях MemoryError
приведет к остановке. Следовательно, обрабатывать такие ошибки не рекомендуется, и это не считается хорошей практикой.
Ошибка рекурсии (RecursionError)
Эта ошибка связана со стеком и происходит при вызове функций. Как и предполагает название, ошибка рекурсии возникает, когда внутри друг друга исполняется много методов (один из которых — с бесконечной рекурсией), но это ограничено размером стека.
Все локальные переменные и методы размещаются в стеке. Для каждого вызова метода создается стековый кадр (фрейм), внутрь которого помещаются данные переменной или результат вызова метода. Когда исполнение метода завершается, его элемент удаляется.
Чтобы воспроизвести эту ошибку, определим функцию recursion
, которая будет рекурсивной — вызывать сама себя в бесконечном цикле. В результате появится ошибка StackOverflow
или ошибка рекурсии, потому что стековый кадр будет заполняться данными метода из каждого вызова, но они не будут освобождаться.
def recursion():
return recursion()
recursion()
---------------------------------------------------------------------------
RecursionError Traceback (most recent call last)
<ipython-input-3-c6e0f7eb0cde> in <module>
----> 1 recursion()
<ipython-input-2-5395140f7f05> in recursion()
1 def recursion():
----> 2 return recursion()
... last 1 frames repeated, from the frame below ...
<ipython-input-2-5395140f7f05> in recursion()
1 def recursion():
----> 2 return recursion()
RecursionError: maximum recursion depth exceeded
Ошибка отступа (IndentationError)
Эта ошибка похожа по духу на синтаксическую и является ее подвидом. Тем не менее она возникает только в случае проблем с отступами.
Пример:
for i in range(10):
print('Привет Мир!')
File "<ipython-input-6-628f419d2da8>", line 2
print('Привет Мир!')
^
IndentationError: expected an indented block
Исключения
Даже если синтаксис в инструкции или само выражение верны, они все равно могут вызывать ошибки при исполнении. Исключения Python — это ошибки, обнаруживаемые при исполнении, но не являющиеся критическими. Скоро вы узнаете, как справляться с ними в программах Python. Объект исключения создается при вызове исключения Python. Если скрипт не обрабатывает исключение явно, программа будет остановлена принудительно.
Программы обычно не обрабатывают исключения, что приводит к подобным сообщениям об ошибке:
Ошибка типа (TypeError)
a = 2
b = 'PythonRu'
a + b
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-7-86a706a0ffdf> in <module>
1 a = 2
2 b = 'PythonRu'
----> 3 a + b
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Ошибка деления на ноль (ZeroDivisionError)
10 / 0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-43-e9e866a10e2a> in <module>
----> 1 10 / 0
ZeroDivisionError: division by zero
Есть разные типы исключений в Python и их тип выводится в сообщении: вверху примеры TypeError
и ZeroDivisionError
. Обе строки в сообщениях об ошибке представляют собой имена встроенных исключений Python.
Оставшаяся часть строки с ошибкой предлагает подробности о причине ошибки на основе ее типа.
Теперь рассмотрим встроенные исключения Python.
Встроенные исключения
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
+-- ResourceWarning
Прежде чем переходить к разбору встроенных исключений быстро вспомним 4 основных компонента обработки исключения, как показано на этой схеме.
Try
: он запускает блок кода, в котором ожидается ошибка.Except
: здесь определяется тип исключения, который ожидается в блокеtry
(встроенный или созданный).Else
: если исключений нет, тогда исполняется этот блок (его можно воспринимать как средство для запуска кода в том случае, если ожидается, что часть кода приведет к исключению).Finally
: вне зависимости от того, будет ли исключение или нет, этот блок кода исполняется всегда.
В следующем разделе руководства больше узнаете об общих типах исключений и научитесь обрабатывать их с помощью инструмента обработки исключения.
Ошибка прерывания с клавиатуры (KeyboardInterrupt)
Исключение KeyboardInterrupt
вызывается при попытке остановить программу с помощью сочетания Ctrl + C
или Ctrl + Z
в командной строке или ядре в Jupyter Notebook. Иногда это происходит неумышленно и подобная обработка поможет избежать подобных ситуаций.
В примере ниже если запустить ячейку и прервать ядро, программа вызовет исключение KeyboardInterrupt
. Теперь обработаем исключение KeyboardInterrupt
.
try:
inp = input()
print('Нажмите Ctrl+C и прервите Kernel:')
except KeyboardInterrupt:
print('Исключение KeyboardInterrupt')
else:
print('Исключений не произошло')
Исключение KeyboardInterrupt
Стандартные ошибки (StandardError)
Рассмотрим некоторые базовые ошибки в программировании.
Арифметические ошибки (ArithmeticError)
- Ошибка деления на ноль (Zero Division);
- Ошибка переполнения (OverFlow);
- Ошибка плавающей точки (Floating Point);
Все перечисленные выше исключения относятся к классу Arithmetic
и вызываются при ошибках в арифметических операциях.
Деление на ноль (ZeroDivisionError)
Когда делитель (второй аргумент операции деления) или знаменатель равны нулю, тогда результатом будет ошибка деления на ноль.
try:
a = 100 / 0
print(a)
except ZeroDivisionError:
print("Исключение ZeroDivisionError." )
else:
print("Успех, нет ошибок!")
Исключение ZeroDivisionError.
Переполнение (OverflowError)
Ошибка переполнение вызывается, когда результат операции выходил за пределы диапазона. Она характерна для целых чисел вне диапазона.
try:
import math
print(math.exp(1000))
except OverflowError:
print("Исключение OverFlow.")
else:
print("Успех, нет ошибок!")
Исключение OverFlow.
Ошибка утверждения (AssertionError)
Когда инструкция утверждения не верна, вызывается ошибка утверждения.
Рассмотрим пример. Предположим, есть две переменные: a
и b
. Их нужно сравнить. Чтобы проверить, равны ли они, необходимо использовать ключевое слово assert
, что приведет к вызову исключения Assertion
в том случае, если выражение будет ложным.
try:
a = 100
b = "PythonRu"
assert a == b
except AssertionError:
print("Исключение AssertionError.")
else:
print("Успех, нет ошибок!")
Исключение AssertionError.
Ошибка атрибута (AttributeError)
При попытке сослаться на несуществующий атрибут программа вернет ошибку атрибута. В следующем примере можно увидеть, что у объекта класса Attributes
нет атрибута с именем attribute
.
class Attributes(obj):
a = 2
print(a)
try:
obj = Attributes()
print(obj.attribute)
except AttributeError:
print("Исключение AttributeError.")
2
Исключение AttributeError.
Ошибка импорта (ModuleNotFoundError)
Ошибка импорта вызывается при попытке импортировать несуществующий (или неспособный загрузиться) модуль в стандартном пути или даже при допущенной ошибке в имени.
import nibabel
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
<ipython-input-6-9e567e3ae964> in <module>
----> 1 import nibabel
ModuleNotFoundError: No module named 'nibabel'
Ошибка поиска (LookupError)
LockupError
выступает базовым классом для исключений, которые происходят, когда key
или index
используются для связывания или последовательность списка/словаря неверна или не существует.
Здесь есть два вида исключений:
- Ошибка индекса (
IndexError
); - Ошибка ключа (
KeyError
);
Ошибка ключа
Если ключа, к которому нужно получить доступ, не оказывается в словаре, вызывается исключение KeyError
.
try:
a = {1:'a', 2:'b', 3:'c'}
print(a[4])
except LookupError:
print("Исключение KeyError.")
else:
print("Успех, нет ошибок!")
Исключение KeyError.
Ошибка индекса
Если пытаться получить доступ к индексу (последовательности) списка, которого не существует в этом списке или находится вне его диапазона, будет вызвана ошибка индекса (IndexError: list index out of range python).
try:
a = ['a', 'b', 'c']
print(a[4])
except LookupError:
print("Исключение IndexError, индекс списка вне диапазона.")
else:
print("Успех, нет ошибок!")
Исключение IndexError, индекс списка вне диапазона.
Ошибка памяти (MemoryError)
Как уже упоминалось, ошибка памяти вызывается, когда операции не хватает памяти для выполнения.
Ошибка имени (NameError)
Ошибка имени возникает, когда локальное или глобальное имя не находится.
В следующем примере переменная ans
не определена. Результатом будет ошибка NameError
.
try:
print(ans)
except NameError:
print("NameError: переменная 'ans' не определена")
else:
print("Успех, нет ошибок!")
NameError: переменная 'ans' не определена
Ошибка выполнения (Runtime Error)
Ошибка «NotImplementedError»
Ошибка выполнения служит базовым классом для ошибки NotImplemented
. Абстрактные методы определенного пользователем класса вызывают это исключение, когда производные методы перезаписывают оригинальный.
class BaseClass(object):
"""Опередляем класс"""
def __init__(self):
super(BaseClass, self).__init__()
def do_something(self):
# функция ничего не делает
raise NotImplementedError(self.__class__.__name__ + '.do_something')
class SubClass(BaseClass):
"""Реализует функцию"""
def do_something(self):
# действительно что-то делает
print(self.__class__.__name__ + ' что-то делает!')
SubClass().do_something()
BaseClass().do_something()
SubClass что-то делает!
---------------------------------------------------------------------------
NotImplementedError Traceback (most recent call last)
<ipython-input-1-57792b6bc7e4> in <module>
14
15 SubClass().do_something()
---> 16 BaseClass().do_something()
<ipython-input-1-57792b6bc7e4> in do_something(self)
5 def do_something(self):
6 # функция ничего не делает
----> 7 raise NotImplementedError(self.__class__.__name__ + '.do_something')
8
9 class SubClass(BaseClass):
NotImplementedError: BaseClass.do_something
Ошибка типа (TypeError)
Ошибка типа вызывается при попытке объединить два несовместимых операнда или объекта.
В примере ниже целое число пытаются добавить к строке, что приводит к ошибке типа.
try:
a = 5
b = "PythonRu"
c = a + b
except TypeError:
print('Исключение TypeError')
else:
print('Успех, нет ошибок!')
Исключение TypeError
Ошибка значения (ValueError)
Ошибка значения вызывается, когда встроенная операция или функция получают аргумент с корректным типом, но недопустимым значением.
В этом примере встроенная операция float
получат аргумент, представляющий собой последовательность символов (значение), что является недопустимым значением для типа: число с плавающей точкой.
try:
print(float('PythonRu'))
except ValueError:
print('ValueError: не удалось преобразовать строку в float: \'PythonRu\'')
else:
print('Успех, нет ошибок!')
ValueError: не удалось преобразовать строку в float: 'PythonRu'
Пользовательские исключения в Python
В Python есть много встроенных исключений для использования в программе. Но иногда нужно создавать собственные со своими сообщениями для конкретных целей.
Это можно сделать, создав новый класс, который будет наследовать из класса Exception
в Python.
class UnAcceptedValueError(Exception):
def __init__(self, data):
self.data = data
def __str__(self):
return repr(self.data)
Total_Marks = int(input("Введите общее количество баллов: "))
try:
Num_of_Sections = int(input("Введите количество разделов: "))
if(Num_of_Sections < 1):
raise UnAcceptedValueError("Количество секций не может быть меньше 1")
except UnAcceptedValueError as e:
print("Полученная ошибка:", e.data)
Введите общее количество баллов: 10
Введите количество разделов: 0
Полученная ошибка: Количество секций не может быть меньше 1
В предыдущем примере если ввести что-либо меньше 1, будет вызвано исключение. Многие стандартные исключения имеют собственные исключения, которые вызываются при возникновении проблем в работе их функций.
Недостатки обработки исключений в Python
У использования исключений есть свои побочные эффекты, как, например, то, что программы с блоками try-except работают медленнее, а количество кода возрастает.
Дальше пример, где модуль Python timeit
используется для проверки времени исполнения 2 разных инструкций. В stmt1
для обработки ZeroDivisionError
используется try-except, а в stmt2
— if
. Затем они выполняются 10000 раз с переменной a=0
. Суть в том, чтобы показать разницу во времени исполнения инструкций. Так, stmt1
с обработкой исключений занимает больше времени чем stmt2
, который просто проверяет значение и не делает ничего, если условие не выполнено.
Поэтому стоит ограничить использование обработки исключений в Python и применять его в редких случаях. Например, когда вы не уверены, что будет вводом: целое или число с плавающей точкой, или не уверены, существует ли файл, который нужно открыть.
import timeit
setup="a=0"
stmt1 = '''\
try:
b=10/a
except ZeroDivisionError:
pass'''
stmt2 = '''\
if a!=0:
b=10/a'''
print("time=",timeit.timeit(stmt1,setup,number=10000))
print("time=",timeit.timeit(stmt2,setup,number=10000))
time= 0.003897680000136461
time= 0.0002797570000439009
Выводы!
Как вы могли увидеть, обработка исключений помогает прервать типичный поток программы с помощью специального механизма, который делает код более отказоустойчивым.
Обработка исключений — один из основных факторов, который делает код готовым к развертыванию. Это простая концепция, построенная всего на 4 блоках: try
выискивает исключения, а except
их обрабатывает.
Очень важно поупражняться в их использовании, чтобы сделать свой код более отказоустойчивым.
В этом руководстве вы узнаете о различных типах ошибок и исключений, встроенных в Python. Они возникают всякий раз, когда интерпретатор обнаруживает ошибки.
Мы можем совершать определенные ошибки при написании программы, которые приводят к ошибкам при попытке ее запустить. Программа завершает работу, как только обнаруживает необработанную ошибку. Эти ошибки можно в общих чертах разделить на два класса:
- Синтаксические.
- Логические (исключения).
Ошибки синтаксиса
Ошибка, вызванная несоблюдением правильной структуры (синтаксиса) языка, называется синтаксической ошибкой или ошибкой синтаксического анализа.
Давайте посмотрим на один пример:
>>> if a < 3 File "<interactive input>", line 1 if a < 3 ^ SyntaxError: invalid syntax
Как показано в примере, стрелка указывает, где синтаксический анализатор обнаружил синтаксическую ошибку.
Мы можем заметить здесь, что в операторе if отсутствует двоеточие.
Логические ошибки (исключения)
Ошибки, возникающие во время выполнения (после прохождения проверки синтаксиса), называются исключениями или логическими ошибками.
Например, они возникают, когда мы пытаемся открыть файл (для чтения), который не существует (FileNotFoundError), пытаемся разделить число на ноль (ZeroDivisionError) или импортировать несуществующий модуль (ImportError).
Каждый раз, когда возникают эти типы ошибок времени выполнения, Python создает объект исключения. Если не обработать должным образом, он распечатывает трассировку этой ошибки вместе с некоторыми подробностями о том, почему эта ошибка произошла.
Давайте посмотрим, как Python обрабатывает эти ошибки:
>>> 1 / 0 Traceback (most recent call last): File "<string>", line 301, in runcode File "<interactive input>", line 1, in <module> ZeroDivisionError: division by zero >>> open("imaginary.txt") Traceback (most recent call last): File "<string>", line 301, in runcode File "<interactive input>", line 1, in <module> FileNotFoundError: [Errno 2] No such file or directory: 'imaginary.txt'
Встроенные исключения
Незаконные операции могут вызывать исключения. В Python есть множество встроенных исключений, которые возникают при возникновении соответствующих ошибок. Мы можем просмотреть все встроенные исключения, используя встроенную функцию local() следующим образом:
print(dir(locals()['__builtins__']))
locals() [‘__ builtins__’] вернет модуль встроенных исключений, функций и атрибутов. dir позволяет нам перечислять эти атрибуты в виде строк.
Ниже перечислены некоторые из распространенных встроенных исключений в программировании на Python, а также ошибки, вызывающие их:
Исключение | Причина ошибки |
---|---|
AssertionError | Возникает при сбое утверждения утверждения. |
AttributeError | Возникает при сбое присвоения атрибута или ссылки. |
EOFError | Возникает, когда функция input() достигает условия конца файла. |
FloatingPointError | Возникает при сбое операции с плавающей запятой. |
ГенераторВыход | Поднимается при вызове метода генератора close(). |
ImportError | Возникает, когда импортированный модуль не найден. |
IndexError | Возникает, когда индекс последовательности выходит за пределы допустимого диапазона. |
KeyError | Возникает, когда ключ не найден в словаре. |
KeyboardInterrupt | Возникает, когда пользователь нажимает клавишу прерывания (Ctrl + C или Delete). |
MemoryError | Возникает, когда для операции не хватает памяти. |
NameError | Возникает, когда переменная не найдена в локальной или глобальной области. |
NotImplementedError | Поднят абстрактными методами. |
OSError | Возникает, когда работа системы вызывает ошибку, связанную с системой. |
OverflowError | Возникает, когда результат арифметической операции слишком велик для представления. |
ReferenceError | Возникает, когда слабый ссылочный прокси используется для доступа к референту со сборкой мусора. |
Ошибка выполнения | Возникает, когда ошибка не попадает ни в одну другую категорию. |
StopIteration | Вызывается функцией next(), чтобы указать, что итератор больше не возвращает элемент. |
Синтаксическая ошибка | Возникает парсером при обнаружении синтаксической ошибки. |
IndentationError | Возникает при неправильном отступе. |
TabError | Возникает, когда отступ состоит из несовместимых знаков табуляции и пробелов. |
Системная ошибка | Возникает, когда интерпретатор обнаруживает внутреннюю ошибку. |
SystemExit | Вызывается функцией sys.exit(). |
TypeError | Возникает, когда функция или операция применяется к объекту неправильного типа. |
UnboundLocalError | Возникает, когда делается ссылка на локальную переменную в функции или методе, но с этой переменной не привязано никакого значения. |
UnicodeError | Возникает при возникновении ошибки кодирования или декодирования, связанной с Unicode. |
UnicodeEncodeError | Возникает, когда во время кодирования возникает ошибка, связанная с Unicode. |
UnicodeDecodeError | Возникает, когда во время декодирования возникает ошибка, связанная с Unicode. |
UnicodeTranslateError | Возникает, когда во время перевода возникает ошибка, связанная с Unicode. |
ValueError | Возникает, когда функция получает аргумент правильного типа, но неправильное значение. |
ZeroDivisionError | Возникает, когда второй операнд деления или операции по модулю равен нулю. |
При необходимости мы также можем определить собственные исключения.
Встроенные и определяемые пользователем исключения в Python можно обрабатывать с помощью операторов try, except и finally.
47414cookie-checkОшибки и встроенные исключения в Python
Before Printing the Error Hierarchy let’s understand what an Exception really is? Exceptions occur even if our code is syntactically correct, however, while executing they throw an error. They are not unconditionally fatal, errors which we get while executing are called Exceptions. There are many Built-in Exceptions in Python let’s try to print them out in a hierarchy.
For printing the tree hierarchy we will use inspect module in Python. The inspect module provides useful functions to get information about objects such as modules, classes, methods, functions, and code objects. For example, it can help you examine the contents of a class, extract and format the argument list for a function.
For building a tree hierarchy we will use inspect.getclasstree().
Syntax: inspect.getclasstree(classes, unique=False)
inspect.getclasstree() arranges the given list of classes into a hierarchy of nested lists. Where a nested list appears, it contains classes derived from the class whose entry immediately precedes the list.
If the unique argument is true, exactly one entry appears in the returned structure for each class in the given list. Otherwise, classes using multiple inheritance and their descendants will appear multiple times.
Let’s write a code for printing tree hierarchy for built-in exceptions:
Python3
import
inspect
def
treeClass(
cls
, ind
=
0
):
print
(
'-'
*
ind,
cls
.__name__)
for
i
in
cls
.__subclasses__():
treeClass(i, ind
+
3
)
print
(
"Hierarchy for Built-in exceptions is : "
)
inspect.getclasstree(inspect.getmro(BaseException))
treeClass(BaseException)
Output:
Hierarchy for Built-in exceptions is : BaseException --- Exception ------ TypeError ------ StopAsyncIteration ------ StopIteration ------ ImportError --------- ModuleNotFoundError --------- ZipImportError ------ OSError --------- ConnectionError ------------ BrokenPipeError ------------ ConnectionAbortedError ------------ ConnectionRefusedError ------------ ConnectionResetError --------- BlockingIOError --------- ChildProcessError --------- FileExistsError --------- FileNotFoundError --------- IsADirectoryError --------- NotADirectoryError --------- InterruptedError --------- PermissionError --------- ProcessLookupError --------- TimeoutError --------- UnsupportedOperation ------ EOFError ------ RuntimeError --------- RecursionError --------- NotImplementedError --------- _DeadlockError ------ NameError --------- UnboundLocalError ------ AttributeError ------ SyntaxError --------- IndentationError ------------ TabError ------ LookupError --------- IndexError --------- KeyError --------- CodecRegistryError ------ ValueError --------- UnicodeError ------------ UnicodeEncodeError ------------ UnicodeDecodeError ------------ UnicodeTranslateError --------- UnsupportedOperation ------ AssertionError ------ ArithmeticError --------- FloatingPointError --------- OverflowError --------- ZeroDivisionError ------ SystemError --------- CodecRegistryError ------ ReferenceError ------ MemoryError ------ BufferError ------ Warning --------- UserWarning --------- DeprecationWarning --------- PendingDeprecationWarning --------- SyntaxWarning --------- RuntimeWarning --------- FutureWarning --------- ImportWarning --------- UnicodeWarning --------- BytesWarning --------- ResourceWarning ------ _OptionError ------ error ------ Verbose ------ Error ------ TokenError ------ StopTokenizing ------ EndOfBlock --- GeneratorExit --- SystemExit --- KeyboardInterrupt
Last Updated :
20 Aug, 2020
Like Article
Save Article
Содержание:развернуть
- Как устроен механизм исключений
- Как обрабатывать исключения в Python (try except)
-
As — сохраняет ошибку в переменную
-
Finally — выполняется всегда
-
Else — выполняется когда исключение не было вызвано
-
Несколько блоков except
-
Несколько типов исключений в одном блоке except
-
Raise — самостоятельный вызов исключений
-
Как пропустить ошибку
- Исключения в lambda функциях
- 20 типов встроенных исключений в Python
- Как создать свой тип Exception
Программа, написанная на языке Python, останавливается сразу как обнаружит ошибку. Ошибки могут быть (как минимум) двух типов:
- Синтаксические ошибки — возникают, когда написанное выражение не соответствует правилам языка (например, написана лишняя скобка);
- Исключения — возникают во время выполнения программы (например, при делении на ноль).
Синтаксические ошибки исправить просто (если вы используете IDE, он их подсветит). А вот с исключениями всё немного сложнее — не всегда при написании программы можно сказать возникнет или нет в данном месте исключение. Чтобы приложение продолжило работу при возникновении проблем, такие ошибки нужно перехватывать и обрабатывать с помощью блока try/except
.
Как устроен механизм исключений
В Python есть встроенные исключения, которые появляются после того как приложение находит ошибку. В этом случае текущий процесс временно приостанавливается и передает ошибку на уровень вверх до тех пор, пока она не будет обработано. Если ошибка не будет обработана, программа прекратит свою работу (а в консоли мы увидим Traceback с подробным описанием ошибки).
💁♂️ Пример: напишем скрипт, в котором функция ожидает число, а мы передаём сроку (это вызовет исключение «TypeError»):
def b(value):
print("-> b")
print(value + 1) # ошибка тут
def a(value):
print("-> a")
b(value)
a("10")
> -> a
> -> b
> Traceback (most recent call last):
> File "test.py", line 11, in <module>
> a("10")
> File "test.py", line 8, in a
> b(value)
> File "test.py", line 3, in b
> print(value + 1)
> TypeError: can only concatenate str (not "int") to str
В данном примере мы запускаем файл «test.py» (через консоль). Вызывается функция «a«, внутри которой вызывается функция «b«. Все работает хорошо до сточки print(value + 1)
. Тут интерпретатор понимает, что нельзя конкатенировать строку с числом, останавливает выполнение программы и вызывает исключение «TypeError».
Далее ошибка передается по цепочке в обратном направлении: «b» → «a» → «test.py«. Так как в данном примере мы не позаботились обработать эту ошибку, вся информация по ошибке отобразится в консоли в виде Traceback.
Traceback (трассировка) — это отчёт, содержащий вызовы функций, выполненные в определенный момент. Трассировка помогает узнать, что пошло не так и в каком месте это произошло.
Traceback лучше читать снизу вверх ↑
В нашем примере Traceback
содержится следующую информацию (читаем снизу вверх):
TypeError
— тип ошибки (означает, что операция не может быть выполнена с переменной этого типа);can only concatenate str (not "int") to str
— подробное описание ошибки (конкатенировать можно только строку со строкой);- Стек вызова функций (1-я линия — место, 2-я линия — код). В нашем примере видно, что в файле «test.py» на 11-й линии был вызов функции «a» со строковым аргументом «10». Далее был вызов функции «b».
print(value + 1)
это последнее, что было выполнено — тут и произошла ошибка. most recent call last
— означает, что самый последний вызов будет отображаться последним в стеке (в нашем примере последним выполнилсяprint(value + 1)
).
В Python ошибку можно перехватить, обработать, и продолжить выполнение программы — для этого используется конструкция try ... except ...
.
Как обрабатывать исключения в Python (try except)
В Python исключения обрабатываются с помощью блоков try/except
. Для этого операция, которая может вызвать исключение, помещается внутрь блока try
. А код, который должен быть выполнен при возникновении ошибки, находится внутри except
.
Например, вот как можно обработать ошибку деления на ноль:
try:
a = 7 / 0
except:
print('Ошибка! Деление на 0')
Здесь в блоке try
находится код a = 7 / 0
— при попытке его выполнить возникнет исключение и выполнится код в блоке except
(то есть будет выведено сообщение «Ошибка! Деление на 0»). После этого программа продолжит свое выполнение.
💭 PEP 8 рекомендует, по возможности, указывать конкретный тип исключения после ключевого слова except
(чтобы перехватывать и обрабатывать конкретные исключения):
try:
a = 7 / 0
except ZeroDivisionError:
print('Ошибка! Деление на 0')
Однако если вы хотите перехватывать все исключения, которые сигнализируют об ошибках программы, используйте тип исключения Exception
:
try:
a = 7 / 0
except Exception:
print('Любая ошибка!')
As — сохраняет ошибку в переменную
Перехваченная ошибка представляет собой объект класса, унаследованного от «BaseException». С помощью ключевого слова as
можно записать этот объект в переменную, чтобы обратиться к нему внутри блока except
:
try:
file = open('ok123.txt', 'r')
except FileNotFoundError as e:
print(e)
> [Errno 2] No such file or directory: 'ok123.txt'
В примере выше мы обращаемся к объекту класса «FileNotFoundError» (при выводе на экран через print
отобразится строка с полным описанием ошибки).
У каждого объекта есть поля, к которым можно обращаться (например если нужно логировать ошибку в собственном формате):
import datetime
now = datetime.datetime.now().strftime("%d-%m-%Y %H:%M:%S")
try:
file = open('ok123.txt', 'r')
except FileNotFoundError as e:
print(f"{now} [FileNotFoundError]: {e.strerror}, filename: {e.filename}")
> 20-11-2021 18:42:01 [FileNotFoundError]: No such file or directory, filename: ok123.txt
Finally — выполняется всегда
При обработке исключений можно после блока try
использовать блок finally
. Он похож на блок except
, но команды, написанные внутри него, выполняются обязательно. Если в блоке try
не возникнет исключения, то блок finally
выполнится так же, как и при наличии ошибки, и программа возобновит свою работу.
Обычно try/except
используется для перехвата исключений и восстановления нормальной работы приложения, а try/finally
для того, чтобы гарантировать выполнение определенных действий (например, для закрытия внешних ресурсов, таких как ранее открытые файлы).
В следующем примере откроем файл и обратимся к несуществующей строке:
file = open('ok.txt', 'r')
try:
lines = file.readlines()
print(lines[5])
finally:
file.close()
if file.closed:
print("файл закрыт!")
> файл закрыт!
> Traceback (most recent call last):
> File "test.py", line 5, in <module>
> print(lines[5])
> IndexError: list index out of range
Даже после исключения «IndexError», сработал код в секции finally
, который закрыл файл.
p.s. данный пример создан для демонстрации, в реальном проекте для работы с файлами лучше использовать менеджер контекста with.
Также можно использовать одновременно три блока try/except/finally
. В этом случае:
- в
try
— код, который может вызвать исключения; - в
except
— код, который должен выполниться при возникновении исключения; - в
finally
— код, который должен выполниться в любом случае.
def sum(a, b):
res = 0
try:
res = a + b
except TypeError:
res = int(a) + int(b)
finally:
print(f"a = {a}, b = {b}, res = {res}")
sum(1, "2")
> a = 1, b = 2, res = 3
Else — выполняется когда исключение не было вызвано
Иногда нужно выполнить определенные действия, когда код внутри блока try
не вызвал исключения. Для этого используется блок else
.
Допустим нужно вывести результат деления двух чисел и обработать исключения в случае попытки деления на ноль:
b = int(input('b = '))
c = int(input('c = '))
try:
a = b / c
except ZeroDivisionError:
print('Ошибка! Деление на 0')
else:
print(f"a = {a}")
> b = 10
> c = 1
> a = 10.0
В этом случае, если пользователь присвоит переменной «с» ноль, то появится исключение и будет выведено сообщение «‘Ошибка! Деление на 0′», а код внутри блока else
выполняться не будет. Если ошибки не будет, то на экране появятся результаты деления.
Несколько блоков except
В программе может возникнуть несколько исключений, например:
- Ошибка преобразования введенных значений к типу
float
(«ValueError»); - Деление на ноль («ZeroDivisionError»).
В Python, чтобы по-разному обрабатывать разные типы ошибок, создают несколько блоков except
:
try:
b = float(input('b = '))
c = float(input('c = '))
a = b / c
except ZeroDivisionError:
print('Ошибка! Деление на 0')
except ValueError:
print('Число введено неверно')
else:
print(f"a = {a}")
> b = 10
> c = 0
> Ошибка! Деление на 0
> b = 10
> c = питон
> Число введено неверно
Теперь для разных типов ошибок есть свой обработчик.
Несколько типов исключений в одном блоке except
Можно также обрабатывать в одном блоке except сразу несколько исключений. Для этого они записываются в круглых скобках, через запятую сразу после ключевого слова except
. Чтобы обработать сообщения «ZeroDivisionError» и «ValueError» в одном блоке записываем их следующим образом:
try:
b = float(input('b = '))
c = float(input('c = '))
a = b / c
except (ZeroDivisionError, ValueError) as er:
print(er)
else:
print('a = ', a)
При этом переменной er
присваивается объект того исключения, которое было вызвано. В результате на экран выводятся сведения о конкретной ошибке.
Raise — самостоятельный вызов исключений
Исключения можно генерировать самостоятельно — для этого нужно запустить оператор raise
.
min = 100
if min > 10:
raise Exception('min must be less than 10')
> Traceback (most recent call last):
> File "test.py", line 3, in <module>
> raise Exception('min value must be less than 10')
> Exception: min must be less than 10
Перехватываются такие сообщения точно так же, как и остальные:
min = 100
try:
if min > 10:
raise Exception('min must be less than 10')
except Exception:
print('Моя ошибка')
> Моя ошибка
Кроме того, ошибку можно обработать в блоке except
и пробросить дальше (вверх по стеку) с помощью raise
:
min = 100
try:
if min > 10:
raise Exception('min must be less than 10')
except Exception:
print('Моя ошибка')
raise
> Моя ошибка
> Traceback (most recent call last):
> File "test.py", line 5, in <module>
> raise Exception('min must be less than 10')
> Exception: min must be less than 10
Как пропустить ошибку
Иногда ошибку обрабатывать не нужно. В этом случае ее можно пропустить с помощью pass
:
try:
a = 7 / 0
except ZeroDivisionError:
pass
Исключения в lambda функциях
Обрабатывать исключения внутри lambda функций нельзя (так как lambda записывается в виде одного выражения). В этом случае нужно использовать именованную функцию.
20 типов встроенных исключений в Python
Иерархия классов для встроенных исключений в Python выглядит так:
BaseException
SystemExit
KeyboardInterrupt
GeneratorExit
Exception
ArithmeticError
AssertionError
...
...
...
ValueError
Warning
Все исключения в Python наследуются от базового BaseException
:
SystemExit
— системное исключение, вызываемое функциейsys.exit()
во время выхода из приложения;KeyboardInterrupt
— возникает при завершении программы пользователем (чаще всего при нажатии клавиш Ctrl+C);GeneratorExit
— вызывается методомclose
объектаgenerator
;Exception
— исключения, которые можно и нужно обрабатывать (предыдущие были системными и их трогать не рекомендуется).
От Exception
наследуются:
1 StopIteration
— вызывается функцией next в том случае если в итераторе закончились элементы;
2 ArithmeticError
— ошибки, возникающие при вычислении, бывают следующие типы:
FloatingPointError
— ошибки при выполнении вычислений с плавающей точкой (встречаются редко);OverflowError
— результат вычислений большой для текущего представления (не появляется при операциях с целыми числами, но может появиться в некоторых других случаях);ZeroDivisionError
— возникает при попытке деления на ноль.
3 AssertionError
— выражение, используемое в функции assert
неверно;
4 AttributeError
— у объекта отсутствует нужный атрибут;
5 BufferError
— операция, для выполнения которой требуется буфер, не выполнена;
6 EOFError
— ошибка чтения из файла;
7 ImportError
— ошибка импортирования модуля;
8 LookupError
— неверный индекс, делится на два типа:
IndexError
— индекс выходит за пределы диапазона элементов;KeyError
— индекс отсутствует (для словарей, множеств и подобных объектов);
9 MemoryError
— память переполнена;
10 NameError
— отсутствует переменная с данным именем;
11 OSError
— исключения, генерируемые операционной системой:
ChildProcessError
— ошибки, связанные с выполнением дочернего процесса;ConnectionError
— исключения связанные с подключениями (BrokenPipeError, ConnectionResetError, ConnectionRefusedError, ConnectionAbortedError);FileExistsError
— возникает при попытке создания уже существующего файла или директории;FileNotFoundError
— генерируется при попытке обращения к несуществующему файлу;InterruptedError
— возникает в том случае если системный вызов был прерван внешним сигналом;IsADirectoryError
— программа обращается к файлу, а это директория;NotADirectoryError
— приложение обращается к директории, а это файл;PermissionError
— прав доступа недостаточно для выполнения операции;ProcessLookupError
— процесс, к которому обращается приложение не запущен или отсутствует;TimeoutError
— время ожидания истекло;
12 ReferenceError
— попытка доступа к объекту с помощью слабой ссылки, когда объект не существует;
13 RuntimeError
— генерируется в случае, когда исключение не может быть классифицировано или не подпадает под любую другую категорию;
14 NotImplementedError
— абстрактные методы класса нуждаются в переопределении;
15 SyntaxError
— ошибка синтаксиса;
16 SystemError
— сигнализирует о внутренне ошибке;
17 TypeError
— операция не может быть выполнена с переменной этого типа;
18 ValueError
— возникает когда в функцию передается объект правильного типа, но имеющий некорректное значение;
19 UnicodeError
— исключение связанное с кодирование текста в unicode
, бывает трех видов:
UnicodeEncodeError
— ошибка кодирования;UnicodeDecodeError
— ошибка декодирования;UnicodeTranslateError
— ошибка переводаunicode
.
20 Warning
— предупреждение, некритическая ошибка.
💭 Посмотреть всю цепочку наследования конкретного типа исключения можно с помощью модуля inspect
:
import inspect
print(inspect.getmro(TimeoutError))
> (<class 'TimeoutError'>, <class 'OSError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>)
📄 Подробное описание всех классов встроенных исключений в Python смотрите в официальной документации.
Как создать свой тип Exception
В Python можно создавать свои исключения. При этом есть одно обязательное условие: они должны быть потомками класса Exception
:
class MyError(Exception):
def __init__(self, text):
self.txt = text
try:
raise MyError('Моя ошибка')
except MyError as er:
print(er)
> Моя ошибка
С помощью try/except
контролируются и обрабатываются ошибки в приложении. Это особенно актуально для критически важных частей программы, где любые «падения» недопустимы (или могут привести к негативным последствиям). Например, если программа работает как «демон», падение приведет к полной остановке её работы. Или, например, при временном сбое соединения с базой данных, программа также прервёт своё выполнение (хотя можно было отловить ошибку и попробовать соединиться в БД заново).
Вместе с try/except
можно использовать дополнительные блоки. Если использовать все блоки описанные в статье, то код будет выглядеть так:
try:
# попробуем что-то сделать
except (ZeroDivisionError, ValueError) as e:
# обрабатываем исключения типа ZeroDivisionError или ValueError
except Exception as e:
# исключение не ZeroDivisionError и не ValueError
# поэтому обрабатываем исключение общего типа (унаследованное от Exception)
# сюда не сходят исключения типа GeneratorExit, KeyboardInterrupt, SystemExit
else:
# этот блок выполняется, если нет исключений
# если в этом блоке сделать return, он не будет вызван, пока не выполнился блок finally
finally:
# этот блок выполняется всегда, даже если нет исключений else будет проигнорирован
# если в этом блоке сделать return, то return в блоке
Подробнее о работе с исключениями в Python можно ознакомиться в официальной документации.
Built-in Exceptions
В Python все исключения должны быть экземплярами класса, производного от BaseException
. В операторе try
с предложением except
, в котором упоминается конкретный класс, это предложение также обрабатывает любые классы исключений, производные от этого класса (но не классы исключений, от которых он является производным). Два класса исключений, которые не связаны через создание подклассов, никогда не эквивалентны, даже если у них одно и то же имя.
Перечисленные ниже встроенные исключения могут быть сгенерированы интерпретатором или встроенными функциями.За исключением упомянутых случаев,они имеют «ассоциированное значение»,указывающее на подробную причину ошибки.Это может быть строка или кортеж из нескольких элементов информации (например,код ошибки и строка,поясняющая код).Ассоциированное значение обычно передается в качестве аргумента конструктору класса исключения.
Пользовательский код может вызывать встроенные исключения.Это может быть использовано для тестирования обработчика исключений или для сообщения о состоянии ошибки «точно так же»,как и в ситуации,когда интерпретатор вызывает то же самое исключение;но следует помнить,что ничто не мешает пользовательскому коду вызвать неподходящую ошибку.
Встроенные классы исключений могут быть подклассами для определения новых исключений; программистам рекомендуется создавать новые исключения из класса Exception
или одного из его подклассов, а не из BaseException
. Дополнительные сведения об определении исключений доступны в Учебном руководстве по Python в разделе Пользовательские исключения .
Exception context
При возникновении нового исключения, когда другое исключение уже обрабатывается, __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__
исключение в __cause__ всегда отображается, если оно присутствует. Неявно __context__
исключение в __context__ отображается, только если __cause__
равно None
, а __suppress_context__
— false.
В любом случае,само исключение всегда показывается после любых цепочечных исключений,так что последняя линия трассировки всегда показывает последнее поднятое исключение.
Наследование от встроенных исключений
Пользовательский код может создавать подклассы, которые наследуются от типа исключения. Рекомендуется создавать подклассы только для одного типа исключений за раз, чтобы избежать любых возможных конфликтов между тем, как базы обрабатывают атрибут args
, а также из-за возможных несовместимостей с расположением памяти.
Детали реализации CPython: большинство встроенных исключений для эффективности реализованы на C, см.: Objects/exceptions.c . Некоторые из них имеют настраиваемые макеты памяти, что делает невозможным создание подкласса, наследуемого от нескольких типов исключений. Структура памяти типа является деталью реализации и может меняться между версиями Python, что приведет к новым конфликтам в будущем. Поэтому рекомендуется вообще избегать создания подклассов нескольких типов исключений.
Base classes
Следующие исключения используются в основном как базовые классы для других исключений.
-
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)
-
add_note(note)
-
Добавьте строку
note
к примечаниям исключения, которые появляются в стандартной трассировке после строки исключения. ОшибкаTypeError
возникает, еслиnote
не является строкой.Новинка в версии 3.11.
-
__notes__
-
Список примечаний к этому исключению, которые были добавлены с помощью
add_note()
. Этот атрибут создается приadd_note()
.Новинка в версии 3.11.
-
-
exception Exception
-
Все встроенные несистемные исключения производятся от этого класса.Все пользовательские исключения также должны быть получены из этого класса.
-
exception ArithmeticError
-
Базовый класс для тех встроенных исключений, которые возникают при различных арифметических ошибках:
OverflowError
,ZeroDivisionError
,FloatingPointError
.
-
exception BufferError
-
Возникает, когда операция, связанная с буфером , не может быть выполнена.
-
exception LookupError
-
Базовый класс для исключений, которые возникают, когда ключ или индекс, используемый в сопоставлении или последовательности, недопустим:
IndexError
,KeyError
. Это можно поднять непосредственно с помощьюcodecs.lookup()
.
Concrete exceptions
Следующие исключения представляют собой исключения,которые обычно поднимаются.
-
exception AssertionError
-
Возникает, когда оператор
assert
терпит неудачу.
-
exception AttributeError
-
Возникает, когда ссылка на атрибут (см. Ссылки на атрибуты ) или назначение не удается. (Когда объект вообще не поддерживает ссылки на атрибуты или назначения атрибутов, возникает
TypeError
.)name
иobj
атрибуты могут быть установлены с помощью именованных аргументов только в конструктор. Когда они установлены, они представляют имя атрибута, к которому была предпринята попытка доступа, и объект, к которому был осуществлен доступ для указанного атрибута, соответственно.Изменено в версии 3.10: Добавлены атрибуты
name
иobj
.
-
exception EOFError
-
Возникает, когда функция
input()
достигает состояния конца файла (EOF) без чтения каких-либо данных. (NB:io.IOBase.read()
иio.IOBase.readline()
возвращают пустую строку при попадании в EOF.)
-
exception FloatingPointError
-
В настоящее время не используется.
-
exception GeneratorExit
-
Возникает при закрытии генератора или сопрограммы ; см.
generator.close()
иcoroutine.close()
. Он напрямую наследуется отBaseException
, а не отException
, поскольку технически это не ошибка.
-
exception ImportError
-
Возникает, когда оператор
import
испытывает проблемы с загрузкой модуля. Также возникает, когда «из списка» в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-CorDelete). Во время выполнения регулярно производится проверка прерываний. Исключение наследуется от
BaseException
, чтобы его случайно не перехватил код, который перехватываетException
и, таким образом, предотвращает выход интерпретатора.Note
Перехват
KeyboardInterrupt
требует особого внимания. Поскольку он может возникать в непредсказуемых точках, в некоторых случаях он может оставить запущенную программу в несогласованном состоянии. Как правило, лучше разрешитьKeyboardInterrupt
завершать программу как можно быстрее или избегать ее полного запуска. (См. Примечание об обработчиках сигналов и исключениях .)
-
exception MemoryError
-
Возникает, когда операции не хватает памяти, но ситуацию еще можно спасти (путем удаления некоторых объектов). Связанное значение представляет собой строку, указывающую, какой (внутренней) операции не хватило памяти. Обратите внимание, что из-за лежащей в основе архитектуры управления памятью (функция
malloc()
в C ) интерпретатор не всегда может полностью выйти из этой ситуации; тем не менее, он вызывает исключение, чтобы можно было распечатать трассировку стека в случае, если причиной была сбежавшая программа.
-
exception NameError
-
Вырастает,когда локальное или глобальное имя не найдено.Это относится только к неквалифицированным именам.Сопутствующее значение представляет собой сообщение об ошибке,включающее имя,которое не может быть найдено.
name
атрибут может быть установлен с помощью ключевого слова только аргумент конструктора. Когда он установлен, он представляет имя переменной, к которой была предпринята попытка доступа.Изменено в версии 3.10: Добавлен атрибут
name
.
-
exception NotImplementedError
-
Это исключение является производным от
RuntimeError
. В определяемых пользователем базовых классах абстрактные методы должны вызывать это исключение, когда они требуют, чтобы производные классы переопределяли метод, или когда класс разрабатывается, чтобы указать, что реальная реализация все еще нуждается в добавлении.Note
Его не следует использовать для указания того, что оператор или метод вообще не предназначен для поддержки — в этом случае либо оставьте оператор/метод неопределенным, либо, если это подкласс, установите для него значение
None
.Note
NotImplementedError
иNotImplemented
не являются взаимозаменяемыми, даже если у них похожие имена и цели. См.NotImplemented
, чтобы узнать, когда его использовать.
-
exception OSError([arg])
- исключение OSError( errno , strerror [, имя файла [, winerror [, имя файла2 ]]])
-
Это исключение возникает,когда системная функция возвращает системную ошибку,включая ошибки ввода-вывода,такие как «файл не найден» или «диск заполнен» (не для недопустимых типов аргументов или других случайных ошибок).
Вторая форма конструктора устанавливает соответствующие атрибуты, описанные ниже. Если не указано иное, атрибуты по умолчанию имеют значение
None
. Для обратной совместимости, если переданы три аргумента, атрибутargs
содержит только кортеж из двух первых двух аргументов конструктора.Конструктор часто фактически возвращает подкласс
OSError
, как описано в исключениях ОС ниже. Конкретный подкласс зависит от окончательного значенияerrno
. Такое поведение возникает только при созданииOSError
напрямую или через псевдоним и не наследуется при создании подклассов.-
errno
-
Числовой код ошибки из переменной C
errno
.
-
winerror
-
В Windows это дает собственный код ошибки Windows. Тогда атрибут
errno
является приблизительным переводом в терминах POSIX этого собственного кода ошибки.В Windows, если аргумент конструктора winerror является целым числом, атрибут
errno
определяется из кода ошибки Windows, а аргумент errno игнорируется. На других платформах аргумент winerror игнорируется, а атрибутwinerror
не существует.
-
strerror
-
Соответствующее сообщение об ошибке, предоставляемое операционной системой. Он форматируется функциями C
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
теперь представляет собой исходное имя файла, переданное функции, а не имя, закодированное или декодированное из кодировки файловой системы и обработчика ошибок . Кроме того, был добавлен аргумент и атрибут конструктора filename2 . -
-
exception OverflowError
-
Возникает, когда результат арифметической операции слишком велик для представления. Этого не может произойти для целых чисел (которые скорее
MemoryError
чем сдадутся ). Однако по историческим причинам OverflowError иногда возникает для целых чисел, выходящих за пределы требуемого диапазона. Из-за отсутствия стандартизации обработки исключений с плавающей запятой в C большинство операций с плавающей запятой не проверяются.
-
exception RecursionError
-
Это исключение является производным от
RuntimeError
. Он возникает, когда интерпретатор обнаруживает превышение максимальной глубины рекурсии (см.sys.getrecursionlimit()
).Новое в версии 3.5: Раньше
RuntimeError
обычная RuntimeError .
-
exception ReferenceError
-
Это исключение возникает, когда слабый ссылочный прокси, созданный
weakref.proxy()
, используется для доступа к атрибуту референта после того, как он был собран сборщиком мусора. Для получения дополнительной информации о слабых ссылках см. Модульweakref
.
-
exception RuntimeError
-
Возникает при обнаружении ошибки,которая не попадает ни в одну из других категорий.Связанное значение представляет собой строку,указывающую,что именно пошло не так.
-
exception StopIteration
-
Вызывается встроенной функцией
next()
и методом__next__()
итератора , чтобы сигнализировать о том, что итератор больше не создает элементов.Объект исключения имеет одно
value
атрибута , которое задается в качестве аргумента при создании исключения и по умолчанию имеет значениеNone
.Когда функция генератора или сопрограммы возвращает значение, создается новый экземпляр
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__()
объекта асинхронного итератора , чтобы остановить итерацию.Новинка в версии 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()
. Если значение является целым числом, оно указывает статус выхода из системы (передается в функцию Cexit()
); если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.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/exceptions.html
Python
3.11
-
enum-Поддержка перечислений
Новинка в версии 3.4.
-
errno-Стандартные символы системы errno
Этот модуль делает доступными стандартные символы системы errno.
-
OS exceptions
Следующие исключения являются подклассами OSError,они вызываются в зависимости от системного кода.
-
faulthandler-сбросить отслеживание Python
Новинка в версии 3.3.