by Radu Tyrsina
Radu Tyrsina has been a Windows fan ever since he got his first PC, a Pentium III (a monster at that time). For most of the kids of… read more
Updated on March 4, 2021
- A run-time error happens when Python understands what you are saying, but runs into trouble when following your instructions.
- You need to know that Python runs the program in two steps.
- Not only Python features runtime errors and if you stumble across one, check our Runtime Errors Hub.
- We wrote extensively about developer tools like Python. Go to our Developer tools Hub.
XINSTALL BY CLICKING THE DOWNLOAD FILE
This software will keep your drivers up and running, thus keeping you safe from common computer errors and hardware failure. Check all your drivers now in 3 easy steps:
- Download DriverFix (verified download file).
- Click Start Scan to find all problematic drivers.
- Click Update Drivers to get new versions and avoid system malfunctionings.
- DriverFix has been downloaded by 0 readers this month.
Programming is pretty fun but at some point, when you try to run the program, unfortunately, and inevitably, errors will show up. So, causing, understanding, and fixing errors is an important part of programming.
There are three major types of error that you can get in Python but here we will talk about how to solve Python runtime errors.
A run-time error happens when Python understands what you are saying, but runs into trouble when following your instructions.
How can I fix Python runtime error?
So you’ve written everything correctly, in other words, your syntax is correct, but Python still doesn’t understand what you’re saying. Let’s have a simple example of a Python runtime error:
- print(solution)
If you try to run this simple line, you will receive a runtime error simply because you didn’t define the solution variable. The line doesn’t have sense.
To understand better that conundrum, let’s make an association with English grammar. Let’s take this sentence for instance.
- Please eat the door.
Grammatically, there is absolutely no problem with this sentence. Everything is there, we have all the syntax elements correct.
But when you are trying to understand the sentence, when you piece up the words, it doesn’t make sense because you know you can open and close the door, even shut it or taking it out but eating it?
In programming, this will be called a run-time error because it shows up before you start the program. There are a few types of runtime errors. In this article, you will learn how to solve them.
1. Use an undefined variable or function.
This can also occur if you use capital letters inconsistently in a variable name:
callMe = “Brad”
print(callme)
Traceback (most recent call last): In line 2 of the code you submitted: print(callme) NameError: name 'callme' is not defined
In this case, the program returned the undefined variable error. You defined the variable callMe, but you try to print another variable, callme. You have to use the variables exactly as you define them, case sensitive.
2. Dividing by zero
Guess what? Python cares about math, and in math, dividing by zero makes no sense.
print(1/0)
Traceback (most recent call last): In line 1 of the code you submitted: print(1/0) ZeroDivisionError: division by zero
So this line returns a runtime error as Python can read it properly, but when it comes to executing it, he refuses to do so as it has no mathematical sense.
3. Use operators on the wrong type of data
print(“you are trying to add text and numbers” + 20)
Traceback (most recent call last): In line 1 of the code you submitted: print("you are trying to add text and numbers" + 20) TypeError: can only concatenate str (not "int") to str
This line returns the runtime error because you try to add text with numbers, crayons, and oranges, chairs with pigeons, etc. It just doesn’t make sense to perform operations with different types of variables.
You also need to know that Python runs the program in two steps. It first checks the syntax and if the syntax is correct, it goes to the second step of executing the program. That’s where he stumbles on possible runtime errors.
We hope this guide answers all your questions but if you have any others or you run into other problems, please throw them down into the comments section below and we will get back at you ASAP.
A runtime error is a type of error that occurs during program execution. The Python interpreter executes a script if it is syntactically correct. However, if it encounters an issue at runtime, which is not detected when the script is parsed, script execution may halt unexpectedly.
What Causes Runtime Errors
Some of the most common examples of runtime errors in Python are:
- Division by zero.
- Using an undefined variable or function name.
- Performing an operation on incompatible types.
- Accessing a list element, dictionary key or object attribute that does not exist.
- Accessing a file that does not exist.
Python Runtime Error Examples
Here’s a few examples of runtime errors in Python:
Division by zero
If a number is divided by zero in Python, a runtime error is raised:
print(100/0)
In the above example, a number is attempted to be divided by zero. Running the above code raises a ZeroDivisionError
:
Traceback (most recent call last):
File "main.py", line 1, in <module>
print(100/0)
ZeroDivisionError: division by zero
Using an undefined variable or function name
A runtime error is raised if an attempt is made to access an identifier, such as a variable or function name, that is not declared previously:
print(myString)
In the above example, an undefined identifier myString
is attempted to be accessed. Running the above code raises a NameError
:
Traceback (most recent call last):
File "main.py", line 1, in <module>
print(myString)
NameError: name 'myString' is not defined
Performing an operation on incompatible types
If an operation, such as addition, multiplication etc., is performed between incompatible data types, a runtime error is raised:
myString = "Hello World"
myNumber = 100
print(myString + myNumber)
In the above example, a string is attempted to be concatenated with a number. Since these types are incompatible, a TypeError
is raised when the above code is executed:
File "main.py", line 3, in <module>
print(myString + myNumber)
TypeError: can only concatenate str (not "int") to str
Accessing a non-existent list element, dictionary key or object attribute
If an attempt is made to access a non-existent index or element in a list, dictionary or object, a runtime error is raised.
numbers = [1, 2, 3]
print(numbers[3])
In the above example, an attempt is made to access an item in a list using an out-of-range index, which raises an IndexError
:
Traceback (most recent call last):
File "main.py", line 2, in <module>
print(numbers[3])
IndexError: list index out of range.
Accessing a file that does not exist
If a file that does not exist is attempted to be accessed, a runtime error is raised:
open("myFile.txt", "r")
In the above example, a non-existent file myFile.txt
is attempted to be opened in read-only mode, which raises a FileNotFoundError
:
Traceback (most recent call last):
File "main.py", line 1, in <module>
open("myFile.txt", "r")
FileNotFoundError: [Errno 2] No such file or directory: 'myFile.txt'
How to Fix Runtime Errors in Python
To fix runtime errors in Python, the following steps can be taken:
- Identify the error message and note the specific problem being reported.
- Check the code for logical, mathematical or typographical errors.
- Ensure all identifiers are defined properly before being used.
- Make sure the correct data types are being used and are being used correctly.
- Verify that list items, dictionary keys, and other objects are being accessed using valid indices or keys.
- If necessary, consult the documentation for the relevant library or module.
Track, Analyze and Manage Errors With Rollbar
Managing errors and exceptions in your code is challenging. It can make deploying production code an unnerving experience. Being able to track, analyze, and manage errors in real-time can help you to proceed with more confidence. Rollbar automates error monitoring and triaging, making fixing Python errors easier than ever. Try it today!
Обработка ошибок увеличивает отказоустойчивость кода, защищая его от потенциальных сбоев, которые могут привести к преждевременному завершению работы.
Прежде чем переходить к обсуждению того, почему обработка исключений так важна, и рассматривать встроенные в 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 будет завершаться при возникновении ошибок, но это не всегда лучший образ действий. Например, мы не хотим, чтобы наш код неожиданно прерывался, когда конечный пользователь с ним работает. Обработка ошибок вносит исправление, которое делает наш код более устойчивым и предотвращает возможные сбои, приводящие к краху нашего приложения.
Различные недостатки всегда будут возникать при программировании. За некоторые проблемы отвечает наш код, например, за синтаксические ошибки. В большинстве случаев такую неточность называют багом. Недостатки должны исправляться.
Даже программа, не имеющая багов, может иметь проблемы, поскольку не все недостатки бывают вызваны кодом. Они могут быть результатом непредусмотренных событий или процедур. Такой тип проблем называется исключениями. Например:
- Диск может быть заполнен во время записи данных в файлы и препятствовать дальнейшей записи.
- Неожиданно обрушилась сеть во время загрузки той или иной информации.
- Использование 0 в знаменателе при делении.
Разница между ошибкой и исключением
Есть два типа ошибок в Python, которые мы должны хорошо понимать. Один тип — это синтаксические ошибки (или ошибки парсинга). При парсинге программы будет обнаружен ошибочный оператор. Ошибки этой природы не могут быть исправлены во время выполнения программы и требуют исправления кода.
Ошибки исключения — еще один тип ошибок, с которыми мы сталкиваемся. Эти ошибки имеют место, когда наш код синтаксически верен, но возникают непредвиденные ситуации при выполнении программы. Они относятся ко времени исполнения и не всегда смертельны. Далее в статье мы сосредоточимся на этих видах ошибок.
Типы ошибок
Синтаксические ошибки
Расположение букв и символов в коде называется синтаксисом. Поэтому, если вы встречаете синтаксическую ошибку, это обычно означает, что в вашем коде пропущен символ или буква. Python будет часто информировать вас о строке и местоположении проблемы. Сообщение об ошибке следует читать очень внимательно.
Блок кода:
num1 = 2
num2 = 3
Num3 = num1 num2
print(num3)
Вывод:
Ошибка нехватки памяти
Если вы получаете сообщение об ошибке памяти, вашему программному обеспечению не хватает памяти. Это говорит о том, что ваше ПО создает слишком много объектов. Memory Error сигнализирует о нехватке доступной памяти для выделения интерпретатором вашему приложению Python. Это может быть проблемой конфигурирования Python или проблемой, связанной с функцией загрузки многих конкурирующих за ресурсы данных.
Ошибка рекурсии
Когда интерпретатор Python при выполнении вашей программы превышает предел рекурсии, возникает исключение Python Recursion Error. Предел рекурсии в Python может быть увеличен, или ваш код может быть переделан, чтобы использовать итерацию, а не рекурсию, чтобы избавиться от этой ошибки.
Блок кода:
def abc():
return abc()
abc()
Вывод:
Ошибка отступа
Python является процедурным языком, поэтому если вы не поместите табулятор или пробелы между строкам вашего кода, то, вероятно, получите ошибку Indentation Error.
Блок кода:
for i in range(3):
print(i)
Вывод:
Что такое обработка исключений в Python?
Вы можете с удобством обслуживать исключения, благодаря встроенной в Python системе обработки исключений. Это механизм try…except…finally.
Все исключения в Python должны быть экземплярами классов, происходящими от Base Exception. Python предлагает разнообразные исключения для часто случающихся ситуаций.
Обычные типы исключений в Python
Ошибка атрибута
Ошибки, связанные со ссылками на атрибуты или присвоением.
Блок кода:
arr = [1,2,3,4,5]
arr.len()
Вывод:
Ошибка индекса
Ошибка возникает, когда индекс последовательности выходит за границы.
Блок кода:
arr = [1,2,3,4,5]
print(arr[200])
Ошибка деления на нуль
Когда целое делится на 0, возникает Zero Division Error.
Блок кода:
arr = 1
arr = 0
print(a/b)
Вывод:
Ошибка типа
Эта ошибка возникает, когда в операции или методе используется объект неправильного типа.
Блок кода:
arr = [1,2,3,4,5]
arr.insert(1)
Вывод:
Ошибка значения
Эта ошибка возникает, когда функция получает аргумент правильного типа, но неверное значение.
Блок кода:
import math
math.sqrt(-33)
Вывод:
Ошибка имени
Эта ошибка возникает, когда идентификатор не находится ни в локальном, ни в глобальном пространстве имен.
Блок кода:
print(Num)
Вывод:
Ошибка ключа
Эта ошибка возникает, когда словарь не включает заданный ключ.
Блок кода:
dic={"name":"achyut","age":20}
print(dic["value"])
Вывод:
Ошибка импорта
Эта ошибка возникает, когда модуль не может быть загружен оператором import.
Блок кода:
from math import add
Вывод:
Предложение Try и оператор Except
Теперь, когда мы вполне осознаем множество дефектов времени выполнения, которые могут привести к нештатному поведению наших программ, мы готовы к решению таких проблем. В Python мы строим блоки try и except для обработки исключений.
Синтаксис
try:
#возможный блок кода, который может вызвать исключение
except Exception:
#Код, который реагирует на возникающую ошибку
Замечание. Один блок try может обрабатывать множество блоков except для различных исключений.
Наша программа стартует в блоке try и начинает выполнение. Если возникает исключение, создается объект типа Exception, обрабатывается и перехватывается блоком except. После завершения блока try и при отсутствии исключений блок except пропускается и выполняется следующий оператор, если он есть. В противном случае программа завершается нормально.
Пример
a = input ("enter the Numerator:")
b = input ("enter the Denominator:")
try:
res = int(a) / int(b)
print ('result is:', res)
except ZeroDivisionError as e:
print ('exception is:', e)
Вывод:
Как видно в примере выше, мы можем включить в оператор try часть кода, которая способна вызвать исключение. Блок кода оператора except будет выполняться, если исключения действительно произойдут.
Ошибки могут быть разнообразными. Следует использовать различные блоки except для обработки возникающих ошибок различного вида. Конечно, можно перехватить более одного типа ошибок.
Try с предложением Finally
Предложение finally будет выполнено вне зависимости от того, произошло ли исключение. Эта функциональность довольно полезна, когда нам нужно гарантировать, что нечто будет сделано вне зависимости от попадания в исключение. Например, мы должны всегда гарантировать закрытие файла при завершении работы с ним.
Пример блока Finally
Блок кода:
a = input ("enter the Numerator:")
b = input ("enter the Denominator:")
try:
res = int(a) / int(b)
print ('result is:', res)
except ZeroDivisionError as e:
print ('exception is:', e)
finally:
print ("thank you")
Вывод:
Try с предложением Else
При отсутствии исключений мы можем также приказать программе выполнить код, используя условие else. При отсутствии исключений программа будет выполнять предложение else.
Пример блока Else
Блок кода:
a = input ("enter the Numerator:")
b = input ("enter the Denominator:")
try:
res = int(a) / int(b)
print ('result is:', res)
except ZeroDivisionError as e:
print ('exception is :', e)
else:
print("hello")
finally:
print ("thank you")
Вывод:
Захват конкретных исключений в Python
Как мы уже установили, одинаковая обработка каждой ситуации и захват каждого исключения в предложении except не является хорошей практикой программирования. Следует указывать конкретные исключения, которые будет перехватывать предложение except. Мы можем захватить только встроенное исключение ошибки имени, которое будет обрабатывать исключение, когда пользователь введет некорректное имя.
Пример
Блок кода:
def name_exception():
try:
value = "achyut tripathi"
return xyz
except NameError:
return "NameError occurred"
print(name_exception())
Вывод:
Вызов исключения в Python
В некоторых обстоятельствах мы должны выполнить пользовательскую логику, чтобы остановить операцию с помощью уникальной ошибки или исключения. Пользовательское исключение, которое будет обрабатывать блок «try-except», может использоваться, чтобы вызвать завершение исполнения.
Пример
Создадим небольшую функцию, которая ожидает число между 1 и 50. Если функция получает значение за пределами этого диапазона, работа приложения будет прервана с помощью пользовательского исключения.
Блок кода:
def range_function(range):
try:
if range > 50 or range <0:
raise Exception()
if range < 100 and range > 0:
print("Range is ok")
except:
print("Exception Occurred")
range_function(150)
Вывод:
Заключение
Примеры в этом руководстве показывают как использовать в Python блок «try-except-finally».
Когда ваш код попадает в производственную среду, обработка ошибок — отличный способ гарантировать, что он ориентирован на будущее. Конечно, юнит-тестирование и реализация ООП также важны. Избегайте слишком большого числа блоков try и except, поскольку это несколько замедлит выполнение вашего кода и в целом его потребуется больше написать. Старайтесь не использовать его, если это не является абсолютно необходимым, например, когда требуется ввод данных пользователем или открывается файл.
Ошибки и исключения
До сих пор сообщения об ошибках не были более чем упомянуты, но если вы пробовали примеры, вы, вероятно, видели некоторые из них. Есть (по крайней мере) два различных вида ошибок: синтаксические ошибки и исключения .
8.1.Ошибки синтаксиса
Синтаксические ошибки,также известные как ошибки синтаксического анализа,являются,пожалуй,самым распространенным видом жалоб,которые вы получаете в процессе изучения Python:
>>> while True print('Hello world') File "<stdin>", line 1 while True print('Hello world') ^ SyntaxError: invalid syntax
Анализатор повторяет ошибочную строку и отображает небольшую «стрелку», указывающую на самую раннюю точку в строке, где была обнаружена ошибка. Ошибка вызвана (или, по крайней мере, обнаружена) токеном, предшествующим стрелке: в примере ошибка обнаружена в функции print()
, поскольку перед ней отсутствует двоеточие ( ':'
). Имя файла и номер строки печатаются, чтобы вы знали, где искать, если ввод поступил из скрипта.
8.2. Exceptions
Даже если оператор или выражение синтаксически верны, они могут вызвать ошибку при попытке их выполнить. Ошибки, обнаруженные во время выполнения, называются исключениями и не являются безоговорочно фатальными: вы скоро научитесь обрабатывать их в программах Python. Однако большинство исключений не обрабатываются программами и приводят к сообщениям об ошибках, как показано здесь:
>>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name >>> Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str
Последняя строка сообщения об ошибке указывает, что произошло. Исключения бывают разных типов, и тип печатается как часть сообщения: типы в примере — ZeroDivisionError
, NameError
и TypeError
. Строка, напечатанная как тип исключения, — это имя возникшего встроенного исключения. Это верно для всех встроенных исключений, но не обязательно для пользовательских исключений (хотя это полезное соглашение). Стандартные имена исключений — это встроенные идентификаторы (не зарезервированные ключевые слова).
Остальная часть строки содержит подробную информацию о типе исключения и о том,что его вызвало.
Предшествующая часть сообщения об ошибке показывает контекст,в котором произошло исключение,в виде трассировки стека.В общем случае он содержит трассировку стека с перечислением исходных строк;однако он не отображает строки,считанные со стандартного ввода.
Встроенные исключения перечисляет встроенные исключения и их значения.
8.3.Обработка исключений
Можно написать программы,которые обрабатывают выбранные исключения.Посмотрите на следующий пример,который запрашивает у пользователя ввод до тех пор,пока не будет введено действительное целое число,но позволяет пользователю прервать программу (используяControl-Cили все, что поддерживает операционная система); обратите внимание, что пользовательское прерывание сигнализируется возбуждением исключения KeyboardInterrupt
.
>>> while True: ... try: ... x = int(input("Please enter a number: ")) ... break ... except ValueError: ... print("Oops! That was no valid number. Try again...") ...
Оператор try
работает следующим образом.
- Сначала выполняется предложение try (операторы между ключевыми словами
try
иexcept
). - Если не возникает исключения, предложение except пропускается и выполнение оператора
try
завершается. -
try
возникает исключение , остальная часть предложения пропускается. Затем, если его тип соответствует исключению, названному после ключевого слова except, выполняетсяexcept
except , а затем выполнение продолжается после блока try / except. - Если возникает исключение, которое не соответствует исключению, указанному в предложении except , оно передается во внешние операторы
try
; если обработчик не найден, это необработанное исключение , и выполнение останавливается с сообщением, как показано выше.
У оператора try
может быть более одного предложения except , чтобы указать обработчики для разных исключений. Будет выполнено не более одного обработчика. Обработчики обрабатывают только исключения, которые возникают в соответствующем предложении try , а не в других обработчиках того же оператора try
. Предложение except может называть несколько исключений в виде кортежа в скобках, например:
... except (RuntimeError, TypeError, NameError): ... pass
Класс в предложении except
совместим с исключением, если это тот же класс или его базовый класс (но не наоборот — предложение исключения, перечисляющее производный класс, несовместимо с базовым классом). Например, следующий код напечатает B, C, D в указанном порядке:
class B(Exception): pass class C(B): pass class D(C): pass for cls in [B, C, D]: try: raise cls() except D: print("D") except C: print("C") except B: print("B")
Обратите внимание, что если бы предложения исключения были перевернуты (с первым except B
), он напечатал бы B, B, B — срабатывает первое подходящее предложение кроме .
Когда возникает исключение, оно может иметь связанные значения, также известные как аргументы исключения . Наличие и типы аргументов зависят от типа исключения.
Предложение exclude может указывать переменную после имени исключения. Переменная привязана к экземпляру исключения, который обычно имеет атрибут args
, в котором хранятся аргументы. Для удобства встроенные типы исключений определяют __str__()
для печати всех аргументов без явного доступа к .args
.
>>> try: ... raise Exception('spam', 'eggs') ... except Exception as inst: ... print(type(inst)) ... print(inst.args) ... print(inst) ... ... x, y = inst.args ... print('x =', x) ... print('y =', y) ... <class 'Exception'> ('spam', 'eggs') ('spam', 'eggs') x = spam y = eggs
Вывод исключения __str__()
печатается как последняя часть («подробности») сообщения для необработанных исключений.
BaseException
— это общий базовый класс всех исключений. Один из его подклассов, Exception
, является базовым классом всех нефатальных исключений. Исключения, которые не являются подклассами Exception
, обычно не обрабатываются, поскольку они используются для указания того, что программа должна завершиться. Они включают SystemExit
, который вызывается sys.exit()
, и KeyboardInterrupt
, который вызывается, когда пользователь хочет прервать программу.
Exception
можно использовать как подстановочный знак, который перехватывает (почти) все. Однако хорошей практикой является максимально точное определение типов исключений, которые мы намерены обрабатывать, и разрешение распространения любых непредвиденных исключений.
Наиболее распространенный шаблон для обработки Exception
заключается в том, чтобы распечатать или зарегистрировать исключение, а затем повторно вызвать его (позволяя вызывающему объекту также обрабатывать исключение):
import sys try: f = open('myfile.txt') s = f.readline() i = int(s.strip()) except OSError as err: print("OS error:", err) except ValueError: print("Could not convert data to an integer.") except Exception as err: print(f"Unexpected {err=}, {type(err)=}") raise
Оператор try
… except
имеет необязательное предложение else , которое, если оно присутствует, должно следовать за всеми предложениями кроме . Это полезно для кода, который должен быть выполнен, если предложение try не вызывает исключение. Например:
for arg in sys.argv[1:]: try: f = open(arg, 'r') except OSError: print('cannot open', arg) else: print(arg, 'has', len(f.readlines()), 'lines') f.close()
Использование предложения else
лучше, чем добавление дополнительного кода в предложение try
, потому что оно позволяет избежать случайного перехвата исключения, которое не было вызвано кодом, защищенным оператором try
… except
.
Обработчики исключений обрабатывают не только исключения, возникающие непосредственно в предложении try , но и те, которые возникают внутри функций, вызываемых (даже косвенно) в предложении try . Например:
>>> def this_fails(): ... x = 1/0 ... >>> try: ... this_fails() ... except ZeroDivisionError as err: ... print('Handling run-time error:', err) ... Handling run-time error: division by zero
8.4.Возбуждение исключений
Оператор raise
позволяет программисту принудительно вызвать указанное исключение. Например:
>>> raise NameError('HiThere') Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: HiThere
Единственный аргумент для raise
указывает на возбуждаемое исключение. Это должен быть либо экземпляр исключения, либо класс исключения (класс, производный от BaseException
, например Exception
или один из его подклассов). Если передается класс исключения, он будет неявно создан путем вызова его конструктора без аргументов:
raise ValueError
Если вам нужно определить, было ли вызвано исключение, но вы не собираетесь его обрабатывать, более простая форма оператора raise
позволяет вам повторно вызвать исключение:
>>> try: ... raise NameError('HiThere') ... except NameError: ... print('An exception flew by!') ... raise ... An exception flew by! Traceback (most recent call last): File "<stdin>", line 2, in <module> NameError: HiThere
8.5.Цепочка исключений
Если необработанное исключение возникает внутри раздела except
, к нему будет привязано обрабатываемое исключение, которое будет включено в сообщение об ошибке:
>>> try: ... open("database.sqlite") ... except OSError: ... raise RuntimeError("unable to handle error") ... Traceback (most recent call last): File "<stdin>", line 2, in <module> FileNotFoundError: [Errno 2] No such file or directory: 'database.sqlite' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<stdin>", line 4, in <module> RuntimeError: unable to handle error
Чтобы указать, что исключение является прямым следствием другого, оператор raise
допускает необязательный пункт from
:
raise RuntimeError from exc
Это может быть полезно при преобразовании исключений.Например:
>>> def func(): ... raise ConnectionError ... >>> try: ... func() ... except ConnectionError as exc: ... raise RuntimeError('Failed to open database') from exc ... Traceback (most recent call last): File "<stdin>", line 2, in <module> File "<stdin>", line 2, in func ConnectionError The above exception was the direct cause of the following exception: Traceback (most recent call last): File "<stdin>", line 4, in <module> RuntimeError: Failed to open database
Это также позволяет отключить автоматическую цепочку исключений с помощью идиомы from None
:
>>> try: ... open('database.sqlite') ... except OSError: ... raise RuntimeError from None ... Traceback (most recent call last): File "<stdin>", line 4, in <module> RuntimeError
Дополнительные сведения о механике цепочки см. В разделе Встроенные исключения .
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/tutorial/errors.html
Python
3.11
-
Data Structures
В этой главе более подробно описаны некоторые вещи,о которых вы уже узнали,а также добавлены новые.
-
5.4. Sets
Python также включает тип данных для наборов.
-
8.6.Определяемые пользователем исключения
Программы могут называть свои собственные исключения, создавая новый класс (дополнительную информацию о Python см. в разделе Классы). Можно определить классы исключений, которые делают что-либо другое.
-
Арифметика с плавающей запятой:проблемы и ограничения
Числа с плавающей точкой представляются компьютерной техникой в виде дробей по основанию 2 (двоичных).