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
- RuntimeError
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:
- When you need a derived class to override the abstract method
- 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.
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:
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:
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 –
- Quick Sort in Python
- Python Counter
- Python Concurrency
- 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 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, а в stmt2
— if
. Затем они выполняются 10000 раз с переменной a=0
. Суть в том, чтобы показать разницу во времени исполнения инструкций. Так, stmt1
с обработкой исключений занимает больше времени чем stmt2
, который просто проверяет значение и не делает ничего, если условие не выполнено.
Поэтому стоит ограничить использование обработки исключений в Python и применять его в редких случаях. Например, когда вы не уверены, что будет вводом: целое или число с плавающей точкой, или не уверены, существует ли файл, который нужно открыть.
import timeit
setup="a=0"
stmt1 = '''
try:
b=10/a
except ZeroDivisionError:
pass'''
stmt2 = '''
if a!=0:
b=10/a'''
print("time=",timeit.timeit(stmt1,setup,number=10000))
print("time=",timeit.timeit(stmt2,setup,number=10000))
time= 0.003897680000136461
time= 0.0002797570000439009
Выводы!
Как вы могли увидеть, обработка исключений помогает прервать типичный поток программы с помощью специального механизма, который делает код более отказоустойчивым.
Обработка исключений — один из основных факторов, который делает код готовым к развертыванию. Это простая концепция, построенная всего на 4 блоках: try
выискивает исключения, а except
их обрабатывает.
Очень важно поупражняться в их использовании, чтобы сделать свой код более отказоустойчивым.
Встроенные исключения¶
В Python все исключения должны быть экземплярами класса, производного от 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