Список всех ошибок python

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

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

Прежде чем переходить к обсуждению того, почему обработка исключений так важна, и рассматривать встроенные в 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, а в stmt2if. Затем они выполняются 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. Они возникают всякий раз, когда интерпретатор обнаруживает ошибки.

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

  1. Синтаксические.
  2. Логические (исключения).

Ошибки синтаксиса

Ошибка, вызванная несоблюдением правильной структуры (синтаксиса) языка, называется синтаксической ошибкой или ошибкой синтаксического анализа.

Давайте посмотрим на один пример:

>>> 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 в Python

В нашем примере Traceback содержится следующую информацию (читаем снизу вверх):

  1. TypeError — тип ошибки (означает, что операция не может быть выполнена с переменной этого типа);
  2. can only concatenate str (not "int") to str — подробное описание ошибки (конкатенировать можно только строку со строкой);
  3. Стек вызова функций (1-я линия — место, 2-я линия — код). В нашем примере видно, что в файле «test.py» на 11-й линии был вызов функции «a» со строковым аргументом «10». Далее был вызов функции «b». print(value + 1) это последнее, что было выполнено — тут и произошла ошибка.
  4. 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

В программе может возникнуть несколько исключений, например:

  1. Ошибка преобразования введенных значений к типу float («ValueError»);
  2. Деление на ноль («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() . Если значение является целым числом, оно указывает статус выхода из системы (передается в функцию C 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.


© 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.

Понравилась статья? Поделить с друзьями:
  • Специалисты просмотрели некоторые ошибки допущенные при эксперименте
  • Списание материалов ошибки прошлых лет
  • Спидтест ошибка сокета
  • Спиртовые чернила ошибки
  • Спецоперация это ошибка