Python implementation error

Struggling with a NotImplementedError in your code? In this blog, we'll go over what it is, how to raise it, and how to handle it.

Python Exception Handling – NotImplementedError

Sep 22, 2021 12:21:41 PM |
Python Exception Handling – NotImplementedError

Struggling with a NotImplementedError in your code? In this blog, we’ll go over what it is, how to raise it, and how to handle it.

Today, we’re making our way through our in-depth Python Exception Handling series, and we’ll dive into the NotImplementedError in Python. The NotImplementedError is commonly raised when an abstract method is not implemented in a derived class.

Throughout this post, we’ll examine the NotImplementedError in more detail, starting with where it sits in the larger Python Exception Class Hierarchy. We’ll also look at raising this error, how to handle it, and how Airbrake can help you find this error quickly.

Hierarchy

Like most Python errors, the NotImplementedError derives from the BaseException, more specifically from the RuntimeError class. 

  • BaseException 
    • RuntimeError
      • NotImplementedError 

The NotImplementedError is, fortunately, a non-fatal error. It won’t stop your application from running, but it’s always best to clear errors before they cause issues. 

What is the NotImplementedError? 

According to Python, the NotImplementedError occurs when an abstract method lacks the required derived class to override this method, thus raising this exception.

Let’s break this down a bit. 

While it doesn’t provide abstract classes, Python allows you to use its module, Abstract Base Classes (ABC). Abstract classes are helpful because they create blueprints for other classes and establish a set of methods.

An Abstract Base Class includes one or more abstract methods (methods that have been declared but lack implementation). Subclasses, or child classes, are necessary to implement these abstract methods. 

To summarize, you’ll see the NotImplementedError two reasons: 

  1. When you need a derived class to override the abstract method 
  2. When the implementation is still missing

Now that you know what a NotImplementedError is and why it happens, here’s what you need to do to raise this exception.  

How to Raise a NotImplementedError Exception 

The NotImplementedError is part of Python’s BaseException, meaning it is a built-in exception. Like with all BaseExceptions, you can raise a NotImplementedError exception.

Raise the NotImplementedError like so:

It’s that simple. But imagine having to raise every exception in a similar fashion manually? It’s a time-consuming process. Save time and find Python errors more quickly with Airbrake Error Monitoring. 

How to Handle a NotImplementedError 

If you run into the NotImplementedError, the recommended way to handle it is to implement the abstract method for which the error is being raised. Because the NotImplementedError is user-defined, Python can’t raise this error on its own. So, you’ll need to raise it by a package you’re using or code your team wrote. Once you’ve raised it, you can then implement whatever’s missing.

Let’s refer back to this screenshot: 

In its current form, you’ll raise a NotImplementedError. All you need to do to handle this error is implement the howl function by a subclass before it’s used.  

That’s it! 

Why Use Airbrake Error Monitoring

Want to be alerted about errors within your application? Airbrake Error Monitoring and Performance Monitoring provides real-time alerts about any Python errors in your code. Airbrake alerts will tell you: 

  • When an unhandled Python error occurs 
  • Where an error exists, right down to the line of code
  • The number of occurrences of an error
  • New deploys that introduce errors 
  • Data about an error via the aggregations’ tab

See for yourself how powerful Airbrake is with a free dev account. For the first 30 days, you’ll have access to all of Airbrake’s paid features and unlimited error and performance monitoring.

Python NotImplementedError

Introduction to Python NotImplementedError

Python NotImplementedError Exception occurs at runtime when client characterized base classes; conceptual techniques should raise this exception when they require inferred classes to abrogate the strategy or while the class is being created to demonstrate that the genuine usage despite everything should be included. This does not have a valid syntax as it is an exception runtime error. This ought not to be utilized to show that an administrator or technique isn’t intended to be bolstered by any means; all things considered, either leave the administrator or strategy unclear or, if a subclass, set it to None.

An exception is an occasion that happens during the execution of a program that disturbs the program’s directions’ ordinary progression. By and large, when a Python content experiences a circumstance that it cannot adapt to, it raises an exception. An exception is a Python object that speaks to a mistake. When a Python content raises an exception, it should either deal with the exemption promptly else it ends and stops.

How NotImplementedError Works in Python?

Now we look at how these NotImplementedErrors or exceptions work in Python.

Example

Code:

class BaseClass(object): 
    def __init__(self): 
        super(BaseClass, self).__init__() 
    def do_something(self): 
        raise NotImplementedError(self.__class__.__name__ + '.try_something') 
  
class SubClass(BaseClass): 
    def do_something(self): 
        print (self.__class__.__name__ + ' trying something!')
  
SubClass().do_something() 
BaseClass().do_something() 

Output:

Python NotImplementedError-1.1

Code Explanation: In the above program, we first define an abstract class as our base class. In the main class, we define the interface using the init function and declare an index called self. Once this interface is defined in the base class, it gets prepared to be implemented as soon as we provide the command to define the interface. Soon after this is done, we immediately raise a NotImplementedError, preventing this interface from implementing the command. Hence, when we give the command to ‘try something, it automatically terminates from the abstract class. Then we define the subclass, and we again implement the interface and this time, the implementation works, and it produces the output saying that the subclass is trying something, and it raises the NonImplementation error for the base class and asks us to traceback to this exception.

How to Avoid NotImplementedError in Python?

There are a few circumstances where runtime errors are probably going to happen. At whatever point we attempt to peruse a document or get a client’s contribution, quite possibly something startling will occur – the record may have been moved or erased, and the client may enter information that is not in the correct organization. Great developers should add shields to their projects so regular circumstances like this can be taken care of effortlessly and a program that crashes at whatever point it experiences an effectively predictable issue is not extremely lovely to utilize. Most clients anticipate that projects should be sufficiently strong to recuperate from these sorts of difficulties. Hence, we see various aspects on how to prevent these runtime errors or NotImplementedErrors in Python. There are 2 functions that help in preventing these runtime errors, and they are “try” and “except”.

Example

Code:

try:
    salary = int(input("Enter salary: "))
    print("So cool you earn %d amount." % salary)
except ValueError:
    print("Hey, that wasn't a number!")

Output:

Python NotImplementedError-1.2

Code Explanation: In the above code, we realize that the blunder is probably going to happen when we attempt to change over the client’s contribution to a number. On the off chance that the info string is definitely not a number, this line will trigger a ValueError – that is the reason we indicated it as the sort of blunder that we are going to deal with. We could have determined a progressively broad sort of mistake – or even left the sort out totally, which would have caused to coordinate any sort of exemption – yet that would have been an impractical notion. Imagine a scenario where we got a totally unique mistake that we had not anticipated. It would be dealt with also, and we would not see that anything abnormal was turning out badly. We may likewise need to respond in various manners to various types of blunders. We ought to consistently attempt to pick explicit as opposed to general mistake types for our with the exception of statements. Hence there will not be a runtime error like a NotImplementedError or Value error.

Conclusion

Hence, I conclude by saying that when NotImplementedErrors or exceptions occur in Python during runtime, it will not be interchangeable, and thus the normal implementation is not accepted. This kind of exceptions and errors can be handled by try and except blocks. In NotImplementedError, base classes have unique techniques which will raise this special case when they require determined classes to supersede the strategy or while the class is being created to show that the genuine usage despite everything should be included.

Recommended Articles

This is a guide to Python NotImplementedError. Here we also discuss the introduction and how notimplementederror works in python, along with an example and its code implementation. you may also have a look at the following articles to learn more –

  1. Quick Sort in Python
  2. Python Counter
  3. Python Concurrency
  4. Python Power Function

To solve NotImplementedError in Python, use the abstract method in every child class. The NotImplementedError is raised on Runtime, and it is a user-generated exception.

NotImplementedError exception is mainly used in abstract classes. An abstract class is created, and inside the abstract class, in which this error is raised. If the program does not override the method in the subclass, it will display this error message. The implement is the keyword for inheriting subclass from the Parent class. 

Abstract methods should be overridden in the sub-class. Not implemented means that this error message will be thrown to the user if an abstract method is not implemented in the base class. 

See the following code example.

class Animal:
  def __init__(self, name):
   self.name = name

 def eat(self):
   raise NotImplementedError(
    "You must need to create the eat method in every child class")


class Dog(Animal):
  def __int__(self, name, legs):
    super().__init__(name)
    self.legs = legs


class Cow(Animal):
  def __init__(self, name, color):
    super().__init__(name)
    self.color = color


# Create an object for the child class
c1 = Cow("Milky", "Brown")
c1.eat()

Output

NotImplementedError: You must need to create the eat method in every child class

In this example, we created a parent class known as the Animal. The animal class consists of the constructor and a method named eat().

There are two child classes, one is Dog and the other is Cow. Both of these classes are inherited from the Animal class. Inside the Dog class, we have created a constructor which calls the parent class constructor.

We are assigning names and legs to the Dog class.

Inside the Cow class, we have created a constructor inside which we are calling the parent class constructor using the super keyword. We are assigning names and colors for the cow class. 

And then we have created an object for the Cow class with the name Milky and the color Brown.  When we create this object the Cow class constructor is instantiated and assigns the value for name and color. In the last line, we are calling the eat method.

When this is executed an error occurs. The error message is displayed as: You must need to create the eat() method in every child class. 

We are calling the eat() method that is for the Cow class but the method in the Animal class is executed. This is because we don’t have a eat method inside the Cow class. The method in the parent class should be created inside the child class. This method is called the abstract method. This error is a user-raised error. 

An abstract method is a type of method in which there will be a separate copy of that method inside the child class. This can be overridden inside the child class.

To solve this problem, we have to create the eat() method inside the parent class method and put the eat() method inside all the child classes.

class Animal:
  def __init__(self, name):
    self.name = name

  def eat(self):
   raise NotImplementedError(
    "You must need to create the eat method in every child class")


class Dog(Animal):
  def __init__(self, name, legs):
    super().__init__(name)
    self.legs = legs

  def eat(self):
    print("Dog likes Pedigree !!")


class Cow(Animal):
  def __init__(self, name, color):
    super().__init__(name)
    self.color = color

  def eat(self):
    print("Cow likes green leaves")


# Create an object for the child class
cow = Cow("Milky", "Brown")
cow.eat()
dog = Dog("Tommy", 4)
dog.eat()

Output

Cow likes green leaves
Dog likes Pedigree !!

Conclusion

The NotImplementedError is raised when you do not implement the abstract method in the child class. This error can be solved by using the abstract method in every child class. If we use the abstract method inside the child class, a new instance of that method is created inside the child class. This concept is known as abstraction.

That’s it for this tutorial.

See also

How to Solve OverflowError in Python

How to Solve TypeError: ‘str’ object is not callable in Python

How to Solve FloatingPointError in Python

How to Solve EOFError in Python

How to Solve TypeError: must be str, not int in Python

Krunal Lathiya

Krunal Lathiya is a Software Engineer with over eight years of experience. He has developed a strong foundation in computer science principles and a passion for problem-solving. In addition, Krunal has excellent knowledge of Data Science and Machine Learning, and he is an expert in R Language. Krunal has experience with various programming languages and technologies, including PHP, Python, and JavaScript. He is comfortable working in front-end and back-end development.

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

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

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

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

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

Ошибки могут быть разных видов:

  • Синтаксические
  • Недостаточно памяти
  • Ошибки рекурсии
  • Исключения

Разберем их по очереди.

Синтаксические ошибки (SyntaxError)

Синтаксические ошибки часто называют ошибками разбора. Они возникают, когда интерпретатор обнаруживает синтаксическую проблему в коде.

Рассмотрим на примере.

a = 8
b = 10
c = a b
File "", 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)

 in 
----> 1 recursion()


 in recursion()
      1 def recursion():
----> 2     return recursion()


... last 1 frames repeated, from the frame below ...


 in recursion()
      1 def recursion():
----> 2     return recursion()


RecursionError: maximum recursion depth exceeded

Ошибка отступа (IndentationError)

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

Пример:

for i in range(10):
    print('Привет Мир!')
  File "", line 2
    print('Привет Мир!')
        ^
IndentationError: expected an indented block

Исключения

Даже если синтаксис в инструкции или само выражение верны, они все равно могут вызывать ошибки при исполнении. Исключения Python — это ошибки, обнаруживаемые при исполнении, но не являющиеся критическими. Скоро вы узнаете, как справляться с ними в программах Python. Объект исключения создается при вызове исключения Python. Если скрипт не обрабатывает исключение явно, программа будет остановлена принудительно.

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

Ошибка типа (TypeError)

a = 2
b = 'PythonRu'
a + b
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

 in 
      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)

 in 
----> 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)

 in 
----> 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)

 in 
     14
     15 SubClass().do_something()
---> 16 BaseClass().do_something()


 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 все исключения должны быть экземплярами класса, производного от BaseException. В операторе try с предложением except, в котором упоминается определенный класс, это предложение также обрабатывает любые классы исключений, производные от этого класса (но не классы исключений, от которых он является производным). Два класса исключений, не связанных между собой через подклассы, никогда не эквивалентны, даже если у них одинаковое имя.

Перечисленные ниже встроенные исключения могут быть сгенерированы интерпретатором или встроенными функциями. За исключением упомянутых случаев, они имеют «ассоциированное значение», указывающее на подробную причину ошибки. Это может быть строка или кортеж из нескольких элементов информации (например, код ошибки и строка, поясняющая код). Ассоциированное значение обычно передается в качестве аргумента конструктору класса исключения.

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

Встроенные классы исключений могут быть подклассами для определения новых исключений; программистам рекомендуется выводить новые исключения из класса Exception или одного из его подклассов, а не из BaseException. Более подробную информацию об определении исключений можно найти в учебнике Python в разделе Определяемые пользователем исключения.

Контекст исключения¶

При создании нового исключения, когда другое исключение уже обрабатывается, атрибут __context__ нового исключения автоматически устанавливается на обрабатываемое исключение. Исключение может быть обработано, когда используется предложение except или finally, или оператор with.

Этот неявный контекст исключения можно дополнить явной причиной, используя from с raise:

raise new_exc from original_exc

Выражение, следующее за from, должно быть исключением или None. Оно будет установлено как __cause__ в поднятом исключении. Установка __cause__ также неявно устанавливает атрибут __suppress_context__ в True, так что использование raise new_exc from None эффективно заменяет старое исключение новым для целей отображения (например, преобразование KeyError в AttributeError), оставляя старое исключение доступным в __context__ для интроспекции при отладке.

Код отображения обратного следа по умолчанию показывает эти цепочки исключений в дополнение к обратным следам самого исключения. Явно связанное исключение в __cause__ всегда отображается, если оно присутствует. Неявно связанное исключение в __context__ показывается только в том случае, если __cause__ равно None и __suppress_context__ равно false.

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

Наследование от встроенных исключений¶

Пользовательский код может создавать подклассы, наследующие от типа исключения. Рекомендуется одновременно создавать подклассы только одного типа исключений, чтобы избежать возможных конфликтов между тем, как базы обрабатывают атрибут args, а также из-за возможной несовместимости расположения памяти.

CPython implementation detail: Большинство встроенных исключений для эффективности реализованы на языке C, см: Objects/exceptions.c. Некоторые из них имеют пользовательскую компоновку памяти, что делает невозможным создание подкласса, наследующего от нескольких типов исключений. Схема памяти типа является деталью реализации и может меняться между версиями Python, что приведет к новым конфликтам в будущем. Поэтому рекомендуется избегать создания подклассов для нескольких типов исключений.

Базовые классы¶

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

exception BaseException

Базовый класс для всех встроенных исключений. Он не предназначен для прямого наследования пользовательскими классами (для этого используйте Exception). Если str() вызывается на экземпляре этого класса, возвращается представление аргумента(ов) экземпляра, или пустая строка, если аргументов не было.

args

Кортеж аргументов, передаваемых конструктору исключения. Некоторые встроенные исключения (например, OSError) ожидают определенного количества аргументов и придают особое значение элементам этого кортежа, в то время как другие обычно вызываются только с одной строкой, содержащей сообщение об ошибке.

with_traceback(tb)

Этот метод устанавливает tb в качестве нового обратного пути для исключения и возвращает объект исключения. Этот метод чаще всего использовался до появления возможностей цепочки исключений в PEP 3134. Следующий пример показывает, как мы можем преобразовать экземпляр SomeException в экземпляр OtherException, сохраняя при этом обратную связь. После поднятия текущий кадр выталкивается в трассировку OtherException, как это произошло бы с трассировкой исходного SomeException, если бы мы позволили ему распространиться на вызывающую сторону.

try:
    ...
except SomeException:
    tb = sys.exc_info()[2]
    raise OtherException(...).with_traceback(tb)
exception Exception

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

exception ArithmeticError

Базовый класс для тех встроенных исключений, которые возникают при различных арифметических ошибках: OverflowError, ZeroDivisionError, FloatingPointError.

exception BufferError

Возникает, когда операция, связанная с buffer, не может быть выполнена.

exception LookupError

Базовый класс для исключений, которые возникают, когда ключ или индекс, используемый в отображении или последовательности, недействителен: IndexError, KeyError. Оно может быть вызвано непосредственно codecs.lookup().

Бетонные исключения¶

Ниже перечислены исключения, которые обычно поднимаются.

exception AssertionError

Возникает при неудачном выполнении оператора assert.

exception AttributeError

Возникает, когда ссылка на атрибут (см. Ссылки на атрибуты) или присвоение не удается. (Если объект вообще не поддерживает ссылки на атрибуты или присвоение атрибутов, то вызывается TypeError).

Атрибуты name и obj могут быть установлены с помощью аргументов конструктора, содержащих только ключевые слова. Когда они установлены, они представляют имя атрибута, к которому пытались получить доступ, и объекта, к которому был получен доступ для этого атрибута, соответственно.

Изменено в версии 3.10: Добавлены атрибуты name и obj.

exception EOFError

Возникает, когда функция input() достигает состояния конца файла (EOF) без чтения каких-либо данных. (N.B.: методы io.IOBase.read() и io.IOBase.readline() при попадании в EOF возвращают пустую строку).

exception FloatingPointError

В настоящее время не используется.

exception GeneratorExit

Возникает при закрытии generator или coroutine; см. generator.close() и coroutine.close(). Наследуется непосредственно от BaseException вместо Exception, поскольку технически это не является ошибкой.

exception ImportError

Возникает, когда оператор import испытывает проблемы при попытке загрузить модуль. Также вызывается, когда «from list» в from ... import имеет имя, которое не может быть найдено.

Атрибуты name и path могут быть заданы с помощью аргументов конструктора, содержащих только ключевые слова. Когда они установлены, они представляют имя модуля, который пытались импортировать, и путь к любому файлу, который вызвал исключение, соответственно.

Изменено в версии 3.3: Добавлены атрибуты name и path.

exception ModuleNotFoundError

Подкласс ImportError, который вызывается import, когда модуль не может быть найден. Он также вызывается, когда None найден в sys.modules.

Добавлено в версии 3.6.

exception IndexError

Возникает, когда подскрипт последовательности выходит за пределы диапазона. (Индексы срезов молча усекаются, чтобы попасть в допустимый диапазон; если индекс не является целым числом, выдается сообщение TypeError).

exception KeyError

Возникает, когда ключ отображения (словаря) не найден в наборе существующих ключей.

exception KeyboardInterrupt

Возникает, когда пользователь нажимает клавишу прерывания (обычно Control-C или Delete). Во время выполнения регулярно выполняется проверка на наличие прерываний. Исключение наследуется от BaseException, чтобы не быть случайно пойманным кодом, который ловит Exception, и тем самым предотвратить выход интерпретатора.

Примечание

Ловля KeyboardInterrupt требует особого внимания. Поскольку он может быть вызван в непредсказуемые моменты, в некоторых обстоятельствах он может оставить выполняющуюся программу в непоследовательном состоянии. Обычно лучше всего позволить KeyboardInterrupt завершить программу как можно быстрее или не поднимать его совсем. (См. Примечание об обработчиках сигналов и исключениях.)

exception MemoryError

Возникает, когда у операции закончилась память, но ситуацию еще можно спасти (удалив некоторые объекты). Ассоциированное значение — это строка, указывающая, какая именно (внутренняя) операция исчерпала память. Обратите внимание, что из-за архитектуры управления памятью (функция Си malloc()) интерпретатор не всегда может полностью выйти из этой ситуации; тем не менее, он вызывает исключение, чтобы можно было вывести трассировку стека, в случае, если причиной была запущенная программа.

exception NameError

Возникает, когда локальное или глобальное имя не найдено. Это относится только к неквалифицированным именам. Соответствующим значением является сообщение об ошибке, включающее имя, которое не удалось найти.

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

Изменено в версии 3.10: Добавлен атрибут name.

exception NotImplementedError

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

Примечание

Он не должен использоваться для указания на то, что оператор или метод не должен поддерживаться вообще — в этом случае либо оставьте оператор / метод неопределенным, либо, если это подкласс, установите его в None.

Примечание

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

exception OSError([arg])
exception OSError(errno, strerror[, filename[, winerror[, filename2]]])

Это исключение возникает, когда системная функция возвращает системную ошибку, включая ошибки ввода-вывода, такие как «файл не найден» или «диск заполнен» (не для недопустимых типов аргументов или других случайных ошибок).

Вторая форма конструктора устанавливает соответствующие атрибуты, описанные ниже. Если атрибуты не указаны, то по умолчанию они имеют значение None. Для обратной совместимости, если передается три аргумента, атрибут args содержит только кортеж из двух первых аргументов конструктора.

Конструктор часто возвращает подкласс OSError, как описано ниже в OS exceptions. Конкретный подкласс зависит от конечного значения errno. Такое поведение имеет место только при конструировании OSError напрямую или через псевдоним, и не наследуется при создании подклассов.

errno

Числовой код ошибки из переменной языка C errno.

winerror

В Windows это дает вам код ошибки Windows. Атрибут errno является приблизительным переводом, в терминах POSIX, этого кода ошибки.

Под Windows, если аргумент конструктора winerror является целым числом, атрибут errno определяется из кода ошибки Windows, а аргумент errno игнорируется. На других платформах аргумент winerror игнорируется, а атрибут winerror не существует.

strerror

Соответствующее сообщение об ошибке, предоставляемое операционной системой. Форматируется функциями языка Си perror() под POSIX и FormatMessage() под Windows.

filename
filename2

Для исключений, включающих путь к файловой системе (например, open() или os.unlink()), filename — это имя файла, переданное в функцию. Для функций, включающих два пути к файловой системе (например, os.rename()), filename2 соответствует второму имени файла, переданному в функцию.

Изменено в версии 3.3: EnvironmentError, IOError, WindowsError, socket.error, select.error и mmap.error были объединены в OSError, и конструктор может возвращать подкласс.

Изменено в версии 3.4: Атрибутом filename теперь является исходное имя файла, переданное функции, а не имя, закодированное в или декодированное из filesystem encoding and error handler. Также был добавлен аргумент и атрибут конструктора filename2.

exception OverflowError

Возникает, когда результат арифметической операции слишком велик для представления. Это не может произойти для целых чисел (которые скорее поднимут MemoryError, чем сдадутся). Однако по историческим причинам OverflowError иногда возникает для целых чисел, которые выходят за пределы требуемого диапазона. Из-за отсутствия стандартизации обработки исключений для операций с плавающей запятой в C, большинство операций с плавающей запятой не проверяются.

exception RecursionError

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

Добавлено в версии 3.5: Ранее выдавалось обычное RuntimeError.

exception ReferenceError

Это исключение возникает, когда прокси слабой ссылки, созданный функцией weakref.proxy(), используется для доступа к атрибуту референта после того, как он был собран. Для получения дополнительной информации о слабых ссылках см. модуль weakref.

exception RuntimeError

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

exception StopIteration

Возбуждается встроенной функцией next() и методом iterator‘s __next__() для сигнализации о том, что итератор больше не производит элементов.

Объект исключения имеет единственный атрибут value, который задается в качестве аргумента при конструировании исключения и по умолчанию равен None.

Когда функция generator или coroutine возвращается, поднимается новый экземпляр StopIteration, а значение, возвращенное функцией, используется как параметр value в конструкторе исключения.

Если код генератора прямо или косвенно вызывает StopIteration, он преобразуется в RuntimeError (сохраняя StopIteration в качестве причины нового исключения).

Изменено в версии 3.3: Добавлен атрибут value и возможность для функций-генераторов использовать его для возврата значения.

Изменено в версии 3.5: Введено преобразование RuntimeError через from __future__ import generator_stop, см. PEP 479.

Изменено в версии 3.7: Включите PEP 479 для всего кода по умолчанию: ошибка StopIteration, возникающая в генераторе, преобразуется в RuntimeError.

exception StopAsyncIteration

Должен быть поднят методом __anext__() объекта asynchronous iterator для остановки итерации.

Добавлено в версии 3.5.

exception SyntaxError(message, details)

Возникает, когда синтаксический анализатор сталкивается с синтаксической ошибкой. Это может произойти в операторе import, при вызове встроенных функций compile(), exec() или eval(), или при чтении начального сценария или стандартного ввода (также интерактивно).

В str() экземпляра исключения возвращается только сообщение об ошибке. Details — это кортеж, члены которого также доступны в виде отдельных атрибутов.

filename

Имя файла, в котором произошла синтаксическая ошибка.

lineno

Номер строки в файле, в которой произошла ошибка. Он индексируется по 1: первая строка в файле имеет lineno, равный 1.

offset

Столбец в строке, в котором произошла ошибка. Он индексируется по 1: первый символ в строке имеет offset, равный 1.

text

Текст исходного кода, в котором произошла ошибка.

end_lineno

Номер строки в файле, в которой произошла ошибка. Это 1-индекс: первая строка в файле имеет lineno, равный 1.

end_offset

Заканчивается столбец в конечной строке, в которой произошла ошибка. Он индексируется по 1: первый символ в строке имеет offset, равный 1.

Для ошибок в полях f-строки сообщение имеет префикс «f-строка: «, а смещения являются смещениями в тексте, построенном из выражения замены. Например, компиляция f’Bad {a b} field“ приводит к такому атрибуту args: („f-string: …“, („“, 1, 2, „(a b)n“, 1, 5)).

Изменено в версии 3.10: Добавлены атрибуты end_lineno и end_offset.

exception IndentationError

Базовый класс для синтаксических ошибок, связанных с неправильным отступом. Это подкласс класса SyntaxError.

exception TabError

Возникает, когда отступ содержит непоследовательное использование табуляции и пробелов. Это подкласс IndentationError.

exception SystemError

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

Вы должны сообщить об этом автору или сопровождающему вашего интерпретатора Python. Обязательно сообщите версию интерпретатора Python (sys.version; она также выводится в начале интерактивной сессии Python), точное сообщение об ошибке (ассоциированное значение исключения) и, если возможно, источник программы, вызвавшей ошибку.

exception SystemExit

Это исключение вызывается функцией sys.exit(). Оно наследуется от BaseException вместо Exception, чтобы оно не было случайно поймано кодом, который ловит Exception. Это позволяет исключению правильно распространиться вверх и вызвать выход интерпретатора. Если исключение не обрабатывается, интерпретатор Python завершает работу; отслеживание стека не печатается. Конструктор принимает тот же необязательный аргумент, который передается в sys.exit(). Если значение целое, то оно определяет статус выхода системы (передается в функцию Си exit()); если None, то статус выхода равен нулю; если имеет другой тип (например, строка), то печатается значение объекта и статус выхода равен единице.

Вызов sys.exit() преобразуется в исключение, чтобы обработчики очистки (finally пункты операторов try) могли быть выполнены, и чтобы отладчик мог выполнить сценарий без риска потери управления. Функция os._exit() может быть использована в случае абсолютной необходимости немедленного выхода (например, в дочернем процессе после вызова os.fork()).

code

Статус выхода или сообщение об ошибке, которое передается в конструктор. (По умолчанию None).

exception TypeError

Возникает, когда операция или функция применяется к объекту несоответствующего типа. Связанное значение — это строка, содержащая подробную информацию о несоответствии типа.

Это исключение может быть вызвано пользовательским кодом, чтобы указать, что попытка выполнения операции над объектом не поддерживается и не предполагается. Если объект должен поддерживать данную операцию, но еще не предоставил ее реализацию, то правильным исключением будет NotImplementedError.

Передача аргументов неправильного типа (например, передача list, когда ожидается int) должна привести к ошибке TypeError, а передача аргументов с неправильным значением (например, число за пределами ожидаемых границ) должна привести к ошибке ValueError.

exception UnboundLocalError

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

exception UnicodeError

Вызывается при возникновении ошибки кодирования или декодирования, связанной с Unicode. Является подклассом ValueError.

UnicodeError имеет атрибуты, которые описывают ошибку кодирования или декодирования. Например, err.object[err.start:err.end] указывает конкретный недопустимый вход, на котором кодек не справился.

encoding

Имя кодировки, вызвавшей ошибку.

reason

Строка, описывающая конкретную ошибку кодека.

object

Объект, который кодек пытался закодировать или декодировать.

start

Первый индекс недопустимых данных в object.

end

Индекс после последних недопустимых данных в object.

exception UnicodeEncodeError

Возбуждается, когда во время кодирования возникает ошибка, связанная с Unicode. Является подклассом UnicodeError.

exception UnicodeDecodeError

Возбуждается, когда во время декодирования возникает ошибка, связанная с Unicode. Является подклассом UnicodeError.

exception UnicodeTranslateError

Возбуждается, когда при переводе возникает ошибка, связанная с Unicode. Является подклассом UnicodeError.

exception ValueError

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

exception ZeroDivisionError

Возникает, когда второй аргумент операции деления или модуляции равен нулю. Связанное значение представляет собой строку, указывающую тип операндов и операции.

Следующие исключения сохранены для совместимости с предыдущими версиями; начиная с Python 3.3, они являются псевдонимами OSError.

exception EnvironmentError
exception IOError
exception WindowsError

Доступно только в Windows.

Исключения в ОС¶

Следующие исключения являются подклассами OSError, они вызываются в зависимости от кода системной ошибки.

exception BlockingIOError

Возникает, когда операция блокирует объект (например, сокет), настроенный на неблокирующую операцию. Соответствует errno EAGAIN, EALREADY, EWOULDBLOCK и EINPROGRESS.

В дополнение к атрибутам OSError, BlockingIOError может иметь еще один атрибут:

characters_written

Целое число, содержащее количество символов, записанных в поток до его блокировки. Этот атрибут доступен при использовании классов буферизованного ввода-вывода из модуля io.

exception ChildProcessError

Возникает при неудачной операции над дочерним процессом. Соответствует errno ECHILD.

exception ConnectionError

Базовый класс для вопросов, связанных с подключением.

Подклассами являются BrokenPipeError, ConnectionAbortedError, ConnectionRefusedError и ConnectionResetError.

exception BrokenPipeError

Подкласс ConnectionError, возникает при попытке записи на трубу, в то время как другой конец был закрыт, или при попытке записи на сокет, который был закрыт для записи. Соответствует errno EPIPE и ESHUTDOWN.

exception ConnectionAbortedError

Подкласс ConnectionError, возникающий, когда попытка соединения прерывается одноранговым узлом. Соответствует errno ECONNABORTED.

exception ConnectionRefusedError

Подкласс ConnectionError, вызываемый, когда попытка соединения отвергается пиром. Соответствует errno ECONNREFUSED.

exception ConnectionResetError

Подкласс ConnectionError, вызываемый, когда соединение сбрасывается peer’ом. Соответствует errno ECONNRESET.

exception FileExistsError

Возникает при попытке создать файл или каталог, который уже существует. Соответствует errno EEXIST.

exception FileNotFoundError

Возникает, когда запрашивается файл или каталог, но он не существует. Соответствует errno ENOENT.

exception InterruptedError

Возникает, когда системный вызов прерывается входящим сигналом. Соответствует errno EINTR.

Изменено в версии 3.5: Python теперь повторяет системные вызовы, когда вызов syscall прерывается сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо того, чтобы вызывать InterruptedError.

exception IsADirectoryError

Возникает при запросе файловой операции (например, os.remove()) над каталогом. Соответствует errno EISDIR.

exception NotADirectoryError

Возникает, когда операция с каталогом (например, os.listdir()) запрашивается для чего-то, что не является каталогом. На большинстве платформ POSIX он также может быть вызван, если операция пытается открыть или перейти к файлу, не являющемуся каталогом, как если бы это был каталог. Соответствует errno ENOTDIR.

exception PermissionError

Возникает при попытке выполнить операцию без соответствующих прав доступа — например, прав доступа к файловой системе. Соответствует errno EACCES и EPERM.

exception ProcessLookupError

Возникает, когда данный процесс не существует. Соответствует errno ESRCH.

exception TimeoutError

Возникает, когда системная функция завершается по таймеру на системном уровне. Соответствует errno ETIMEDOUT.

Добавлено в версии 3.3: Были добавлены все вышеперечисленные подклассы OSError.

См.также

PEP 3151 — Переработка иерархии исключений ОС и IO

Предупреждения¶

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

exception Warning

Базовый класс для категорий предупреждений.

exception UserWarning

Базовый класс для предупреждений, генерируемых пользовательским кодом.

exception DeprecationWarning

Базовый класс для предупреждений об устаревших функциях, когда эти предупреждения предназначены для других разработчиков Python.

Игнорируется фильтрами предупреждений по умолчанию, кроме модуля __main__ (PEP 565). Включение Python Development Mode показывает это предупреждение.

Политика обесценивания описана в PEP 387.

exception PendingDeprecationWarning

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

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

Игнорируется фильтрами предупреждений по умолчанию. Включение Python Development Mode показывает это предупреждение.

Политика обесценивания описана в PEP 387.

exception SyntaxWarning

Базовый класс для предупреждений о сомнительном синтаксисе.

exception RuntimeWarning

Базовый класс для предупреждений о сомнительном поведении во время выполнения.

exception FutureWarning

Базовый класс для предупреждений об устаревших функциях, когда эти предупреждения предназначены для конечных пользователей приложений, написанных на Python.

exception ImportWarning

Базовый класс для предупреждений о вероятных ошибках в импорте модулей.

Игнорируется фильтрами предупреждений по умолчанию. Включение Python Development Mode показывает это предупреждение.

exception UnicodeWarning

Базовый класс для предупреждений, связанных с Unicode.

exception EncodingWarning

Базовый класс для предупреждений, связанных с кодировками.

Подробнее см. в разделе Кодирование по желаниюПредупреждение.

Добавлено в версии 3.10.

exception BytesWarning

Базовый класс для предупреждений, связанных с bytes и bytearray.

exception ResourceWarning

Базовый класс для предупреждений, связанных с использованием ресурсов.

Игнорируется фильтрами предупреждений по умолчанию. Включение Python Development Mode показывает это предупреждение.

Добавлено в версии 3.2.

Иерархия исключений¶

Иерархия классов для встроенных исключений такова:

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
      |    +-- ModuleNotFoundError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- EncodingWarning
           +-- ResourceWarning

Понравилась статья? Поделить с друзьями:
  • Python if error try again
  • Python gtts как изменить голос
  • Python gobject dbus may be not installed error plug in install failed
  • Python get error code
  • Python generate error