Содержание
- Integer division or modulo by zero error
- ZeroDivisionError: division by zero in Python #
- ZeroDivisionError: division by zero
- Different Variation of the error
- Root Cause
- How to reproduce this issue
- Output
- Solution 1
- Output
- Solution 2
- Output
- Solution 3
- ZeroDivisionError: as ‘integer division or modulo by zero’ but get as ‘division by zero
- 2 Answers 2
- Обработка исключений в Python
- Основные исключения
- Как обрабатывать исключения?
- ZeroDivisionError: float division | Python
- ZeroDivisionError
- Handling ZeroDivisionError in Python
- Reproducing the error
- Output:
- Wrap it in try except
- Check before you do the division
- Different Variation
Integer division or modulo by zero error
The Python «ZeroDivisionError: integer division or modulo by zero» occurs when we use the modulo % operator with an integer and a zero.
To solve the error, figure out where the 0 comes from and correct the assignment.
Here is an example of how the error occurs.
We tried using the modulo % operator with a zero.
It’s unclear what value is expected when we divide by 0 , so Python throws an error.
When we divide a number by 0 , the result tends towards infinity.
Here are some unexpected sources of 0 .
If you use the random.randint() method or the range() class, make sure to start from 1 , and not from 0 .
You can also conditionally check if the variable doesn’t store a 0 value before using the modulo operator.
Alternatively, you can use a try/except statement.
We use the modulo operator and if we get a ZeroDivisionError , the except block is run.
You can set the result variable to a value that suits your use case in the except block or simply pass.
The modulo (%) operator returns the remainder from the division of the first value by the second.
If the value on the right-hand side is zero, the operator raises a ZeroDivisionError exception.
The left and right-hand side values may also be floating point numbers.
If the left-hand side value is a float and the right-hand side value is 0 , you would get a «ZeroDivisionError: float modulo» error.
ZeroDivisionError: division by zero in Python #
The Python «ZeroDivisionError: division by zero» occurs when we try to divide a number by 0 .
To solve the error, use an if statement to check if the number you are dividing by is not zero, or handle the error in a try/except block.
Here is an example of how the error occurs.
It’s unclear what value is expected when we divide by 0 , so Python throws an error.
When we divide a number by 0 , the result tends towards infinity.
One way to solve the error is to check if the value we are dividing by is not 0 .
We check if the b variable doesn’t store a 0 value and if it doesn’t, we divide a by b .
If setting the result variable to 0 , if b is equal to 0 suits your use case, you can shorten this to a single line.
The expression x and y first evaluates x , and if x is falsy, its value is returned, otherwise, y is returned.
Alternatively, you can use a try/except statement.
The try/except block is known as «asking for forgiveness, rather than permission».
We try to divide a by b and if we get a ZeroDivisionError , the except block sets the result variable to 0 .
The best way to solve the error is to figure out where the variable gets assigned a 0 and check whether that’s the expected behavior.
Here are some common ways you might get a zero value unexpectedly.
Источник
ZeroDivisionError: division by zero
ZeroDivisionError occurs when a number is divided by a zero. In Mathematics, when a number is divided by a zero, the result is an infinite number. It is impossible to write an Infinite number physically. Python interpreter throws “ZeroDivisionError: division by zero” error if the result is infinite number.
You can divide a number by another number. The division operation divides a number into equal parts or groups. Dividing a number into zero pieces or zero groups is meaning less. In mathematics, dividing a number by zero is undefined.
If a number is divided by zero, the result wil be infinite number. Python can not handle the infinite number because the infinite number is difficult to write in concrete form. In this case, Python throws “ZeroDivisionError: division by zero”. The error would be thrown as like below.
Different Variation of the error
In different contexts the Zero Division Error-division by zero is thrown in various forms in python. The numerous variations of ZeroDivisionError are given below.
Root Cause
The zero division error is due to either a number being divided by zero, or a number being modulo by zero. The denominator of the division operation should be a non zero numeric value. If the demonimator is zero then ZeroDivisionError will be thrown by python interpreter.
Dividing a number into zero pieces or zero groups does not make sense. The result is infinite number not representable in python. Therefore, python throws “ZeroDivisionError: integer division or modulo by zero”. This error occurs for all numbers such as integer, long, float and complex number
How to reproduce this issue
A number must be divided by an another non zero number. Python interpreter will throw ZeroDivisionError if you create a simple program with a number divided by zero. If the division denominator is set to zero, then this error will occur.
The example code below shows how this issue can be reproduced.
Output
Solution 1
Python can not divide a number by zero. Before doing a division or modulo operation, the denominator must be verified for nonzero. The code below shows how to handle a denominator when it is zero.
Output
Solution 2
If the program is not sure of the denominator value, the denominator value may be zero in some rare cases. In this case, handle the ZeroDivisionError when it occurs. The example below shows how to handle the exception of ZeroDivisionError in the code.
Output
Solution 3
In the program, if the denominator is zero, the output of the division operation can be set to zero. Mathematically, this may not be correct. Setting zero for the division operation will solve this issue in real-time calculation. The following code shows how to set the zero for the division operation.
Источник
ZeroDivisionError: as ‘integer division or modulo by zero’ but get as ‘division by zero
I want to get the exception of ZeroDivisionError: as ‘integer division or modulo by zero’, but I get as ‘division by zero’. How can I get that?


2 Answers 2
The Python exception is ZeroDivisionError :
If you are trying to handle the exception, do an:
instead of trying to match the exception description.
If this answer doesn’t cover you, please expand on what your needs are and why, so that we help you.
PS A naïve way to accomplish what you seem to ask:
I’m sure you have a reason for wanting the specific error message (maybe to understand float vs int division) so I’ll address that.
Even though there is only one divide by zero exception ( ZeroDivisionError ) it’s given with a different error message depending on the types used and the operation involved.
If you’re trying to get the integer division exception message ( «integer division or modulo by zero» ), you need to perform integer division specifically using // instead of / . Converting numbers to integers with int() before or after dividing doesn’t make / perform integer division.
As an example of how the error messages vary depending on the types involved:
The above pertains to Python 3. / division in Python 2 of two int objects where the denominator is zero would result in the «integer division or modulo by zero» message.
Источник
Обработка исключений в Python

Что вы предпринимаете, когда с работой вашей программы что-то идет не так? Допустим, вы пытаетесь открыть файл, но вы ввели неверный путь, или вы хотите узнать информацию у пользователей и они пишут какую-то бессмыслицу. Вы не хотите, чтобы ваша программа крэшилась, по-этому вы выполняете обработку исключений. В Пайтоне, конструкция всегда обернута в то, что называется try/except. В данном разделе мы рассмотрим следующие понятия:
- Базовые типы исключений;
- Обработка исключений при помощи try/except;
- Узнаем, как работает try/except/finally;
- Выясним, как работает оператор else совместно с try/except;
Начнем со знакомства с самыми обычными исключениями, которые вы увидите в Пайтоне. Обратите внимание на то, что ошибка и исключение – два разных слова, описывающие одно и то же, в контексте обработки исключений.
Основные исключения
Вы уже сталкивались со множеством исключений. Ниже изложен список основных встроенных исключений (определение в документации к Пайтону):
- Exception – то, на чем фактически строятся все остальные ошибки;
- AttributeError – возникает, когда ссылка атрибута или присвоение не могут быть выполнены;
- IOError – возникает в том случае, когда операция I/O (такая как оператор вывода, встроенная функция open() или метод объекта-файла) не может быть выполнена, по связанной с I/O причине: «файл не найден», или «диск заполнен», иными словами.
- ImportError – возникает, когда оператор import не может найти определение модуля, или когда оператор не может найти имя файла, который должен быть импортирован;
- IndexError – возникает, когда индекс последовательности находится вне допустимого диапазона;
- KeyError – возникает, когда ключ сопоставления (dictionary key) не найден в наборе существующих ключей;
- KeyboardInterrupt – возникает, когда пользователь нажимает клавишу прерывания(обычно Delete или Ctrl+C);
- NameError – возникает, когда локальное или глобальное имя не найдено;
- OSError – возникает, когда функция получает связанную с системой ошибку;
- SyntaxError — возникает, когда синтаксическая ошибка встречается синтаксическим анализатором;
- TypeError – возникает, когда операция или функция применяется к объекту несоответствующего типа. Связанное значение представляет собой строку, в которой приводятся подробные сведения о несоответствии типов;
- ValueError – возникает, когда встроенная операция или функция получают аргумент, тип которого правильный, но неправильно значение, и ситуация не может описано более точно, как при возникновении IndexError;
- ZeroDivisionError – возникает, когда второй аргумент операции division или modulo равен нулю;
Существует много других исключений, но вы вряд ли будете сталкиваться с ними так же часто. В целом, если вы заинтересованы, вы можете узнать больше о них в документации Пайтон.
Как обрабатывать исключения?
Обработка исключений в Пайтон – это очень просто. Потратим немного времени и напишем несколько примеров, которые их вызовут. Мы начнем с одной из самых элементарных проблем: деление на ноль.
Источник
ZeroDivisionError: float division | Python
In mathematics, any non-zero number either positive or negative divided by zero is undefined because there is no value. The reason is that the result of a division by zero is undefined is the fact that any attempt at a definition leads to a contradiction.
ZeroDivisionError
The super class of ZeroDivisionError is ArithmeticError. ZeroDivisionError is a built-in Python exception thrown when a number is divided by 0. This means that the exception raised when the second argument of a division or modulo operation is zero. In Mathematics, when a number is divided by a zero, the result is an infinite number. It is impossible to write an Infinite number physically. Python interpreter throws «ZeroDivisionError» error if the result is infinite number. While implementing any program logic and there is division operation make sure always handle ArithmeticError or ZeroDivisionError so that program will not terminate.
Handling ZeroDivisionError in Python
The above code can be reduced to:
Reproducing the error
Output:
You can solve the ZeroDivisionError by the following ways:
Wrap it in try except
Check before you do the division
The above code can be reduced to:
Different Variation
In Python, the Zero Division Error:division by zero is thrown in various forms in different contexts. They are given below:
- ZeroDivisionError: division by zero
- ZeroDivisionError: float division by zero
- ZeroDivisionError: integer division or modulo by zero
- ZeroDivisionError: long division or modulo by zero
- ZeroDivisionError: complex division by zero
Источник
ZeroDivisionError occurs when a number is divided by a zero. In Mathematics, when a number is divided by a zero, the result is an infinite number. It is impossible to write an Infinite number physically. Python interpreter throws “ZeroDivisionError: division by zero” error if the result is infinite number.
You can divide a number by another number. The division operation divides a number into equal parts or groups. Dividing a number into zero pieces or zero groups is meaning less. In mathematics, dividing a number by zero is undefined.
If a number is divided by zero, the result wil be infinite number. Python can not handle the infinite number because the infinite number is difficult to write in concrete form. In this case, Python throws “ZeroDivisionError: division by zero”. The error would be thrown as like below.
Traceback (most recent call last):
File "/Users/python/Desktop/test.py", line 3, in <module>
c=a/b;
ZeroDivisionError: integer division or modulo by zero
[Finished in 0.1s with exit code 1]
Different Variation of the error
In different contexts the Zero Division Error-division by zero is thrown in various forms in python. The numerous variations of ZeroDivisionError are given below.
ZeroDivisionError: integer division or modulo by zero
ZeroDivisionError: long division or modulo by zero
ZeroDivisionError: float division by zero
ZeroDivisionError: complex division by zero
ZeroDivisionError: division by zero
Root Cause
The zero division error is due to either a number being divided by zero, or a number being modulo by zero. The denominator of the division operation should be a non zero numeric value. If the demonimator is zero then ZeroDivisionError will be thrown by python interpreter.
Dividing a number into zero pieces or zero groups does not make sense. The result is infinite number not representable in python. Therefore, python throws “ZeroDivisionError: integer division or modulo by zero”. This error occurs for all numbers such as integer, long, float and complex number
How to reproduce this issue
A number must be divided by an another non zero number. Python interpreter will throw ZeroDivisionError if you create a simple program with a number divided by zero. If the division denominator is set to zero, then this error will occur.
The example code below shows how this issue can be reproduced.
a = 8
b = 0
c = a / b
print c
Output
Traceback (most recent call last):
File "C:UsersUserDesktoppython.py", line 3, in <module>
c = a / b
ZeroDivisionError: division by zero
Traceback (most recent call last):
File "/Users/python/Desktop/test.py", line 3, in <module>
c = a / b
ZeroDivisionError: integer division or modulo by zero
[Finished in 0.0s with exit code 1]
Solution 1
Python can not divide a number by zero. Before doing a division or modulo operation, the denominator must be verified for nonzero. The code below shows how to handle a denominator when it is zero.
a = 8
b = 0
c = ( a / b ) if b != 0 else 0
print c
Output
0
Solution 2
If the program is not sure of the denominator value, the denominator value may be zero in some rare cases. In this case, handle the ZeroDivisionError when it occurs. The example below shows how to handle the exception of ZeroDivisionError in the code.
try:
a = 8
b = 0
c = a / b
except ZeroDivisionError:
c = 0
print c
Output
0
Solution 3
In the program, if the denominator is zero, the output of the division operation can be set to zero. Mathematically, this may not be correct. Setting zero for the division operation will solve this issue in real-time calculation. The following code shows how to set the zero for the division operation.
a = 8
b = 0
if b == 0:
c = 0
else:
c = a / b
print c
Output
0
Что вы предпринимаете, когда с работой вашей программы что-то идет не так? Допустим, вы пытаетесь открыть файл, но вы ввели неверный путь, или вы хотите узнать информацию у пользователей и они пишут какую-то бессмыслицу. Вы не хотите, чтобы ваша программа крэшилась, по-этому вы выполняете обработку исключений. В Пайтоне, конструкция всегда обернута в то, что называется try/except. В данном разделе мы рассмотрим следующие понятия:
- Базовые типы исключений;
- Обработка исключений при помощи try/except;
- Узнаем, как работает try/except/finally;
- Выясним, как работает оператор else совместно с try/except;
Начнем со знакомства с самыми обычными исключениями, которые вы увидите в Пайтоне. Обратите внимание на то, что ошибка и исключение – два разных слова, описывающие одно и то же, в контексте обработки исключений.
Основные исключения
Вы уже сталкивались со множеством исключений. Ниже изложен список основных встроенных исключений (определение в документации к Пайтону):
- Exception – то, на чем фактически строятся все остальные ошибки;
- AttributeError – возникает, когда ссылка атрибута или присвоение не могут быть выполнены;
- IOError – возникает в том случае, когда операция I/O (такая как оператор вывода, встроенная функция open() или метод объекта-файла) не может быть выполнена, по связанной с I/O причине: «файл не найден», или «диск заполнен», иными словами.
- ImportError – возникает, когда оператор import не может найти определение модуля, или когда оператор не может найти имя файла, который должен быть импортирован;
- IndexError – возникает, когда индекс последовательности находится вне допустимого диапазона;
- KeyError – возникает, когда ключ сопоставления (dictionary key) не найден в наборе существующих ключей;
- KeyboardInterrupt – возникает, когда пользователь нажимает клавишу прерывания(обычно Delete или Ctrl+C);
- NameError – возникает, когда локальное или глобальное имя не найдено;
- OSError – возникает, когда функция получает связанную с системой ошибку;
- SyntaxError — возникает, когда синтаксическая ошибка встречается синтаксическим анализатором;
- TypeError – возникает, когда операция или функция применяется к объекту несоответствующего типа. Связанное значение представляет собой строку, в которой приводятся подробные сведения о несоответствии типов;
- ValueError – возникает, когда встроенная операция или функция получают аргумент, тип которого правильный, но неправильно значение, и ситуация не может описано более точно, как при возникновении IndexError;
- ZeroDivisionError – возникает, когда второй аргумент операции division или modulo равен нулю;
Существует много других исключений, но вы вряд ли будете сталкиваться с ними так же часто. В целом, если вы заинтересованы, вы можете узнать больше о них в документации Пайтон.
Как обрабатывать исключения?
Обработка исключений в Пайтон – это очень просто. Потратим немного времени и напишем несколько примеров, которые их вызовут. Мы начнем с одной из самых элементарных проблем: деление на ноль.
|
1 / 0 Traceback (most recent call last): File «<string>», line 1, in <fragment> ZeroDivisionError: integer division or modulo by zero |
|
try: 1 / 0 except ZeroDivisionError: print(«You cannot divide by zero!») |
Если мы обратимся к урокам элементарной математики, то вспомним, что на ноль делить нельзя. В Пайтоне данная операция вызовет ошибку, как мы можем видеть в примере выше. Чтобы поймать ошибку, мы завернем операцию в оператор try/except.
«Голое» исключение
Есть еще один способ поймать ошибку:
|
try: 1 / 0 except: print(«You cannot divide by zero!») |
Но мы его не рекомендуем. На жаргоне Пайтона, это известно как голое исключение, что означает, что будут найдены вообще все исключения. Причина, по которой так делать не рекомендуется, заключается в том, что вы не узнаете, что именно за исключение вы выловите. Когда у вас возникло что-то в духе ZeroDivisionError, вы хотите выявить фрагмент, в котором происходит деление на ноль. В коде, написанном выше, вы не можете указать, что именно вам нужно выявить. Давайте взглянем еще на несколько примеров:
|
my_dict = {«a»:1, «b»:2, «c»:3} try: value = my_dict[«d»] except KeyError: print(«That key does not exist!») |
|
my_list = [1, 2, 3, 4, 5] try: my_list[6] except IndexError: print(«That index is not in the list!») |
В первом примере, мы создали словарь из трех элементов. После этого, мы попытались открыть доступ ключу, которого в словаре нет. Так как ключ не в словаре, возникает KeyError, которую мы выявили. Второй пример показывает список, длина которого состоит из пяти объектов. Мы попытались взять седьмой объект из индекса.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Помните, что списки в Пайтоне начинаются с нуля, так что когда вы говорите 6, вы запрашиваете 7. В любом случае, в нашем списке только пять объектов, по этой причине возникает IndexError, которую мы выявили. Вы также можете выявить несколько ошибок за раз при помощи одного оператора. Для этого существует несколько различных способов. Давайте посмотрим:
|
my_dict = {«a»:1, «b»:2, «c»:3} try: value = my_dict[«d»] except IndexError: print(«This index does not exist!») except KeyError: print(«This key is not in the dictionary!») except: print(«Some other error occurred!») |
Это самый стандартный способ выявить несколько исключений. Сначала мы попробовали открыть доступ к несуществующему ключу, которого нет в нашем словаре. При помощи try/except мы проверили код на наличие ошибки KeyError, которая находится во втором операторе except. Обратите внимание на то, что в конце кода у нас появилась «голое» исключение. Обычно, это не рекомендуется, но вы, возможно, будете сталкиваться с этим время от времени, так что лучше быть проинформированным об этом. Кстати, также обратите внимание на то, что вам не нужно использовать целый блок кода для обработки нескольких исключений. Обычно, целый блок используется для выявления одного единственного исключения. Изучим второй способ выявления нескольких исключений:
|
try: value = my_dict[«d»] except (IndexError, KeyError): print(«An IndexError or KeyError occurred!») |
Обратите внимание на то, что в данном примере мы помещаем ошибки, которые мы хотим выявить, внутри круглых скобок. Проблема данного метода в том, что трудно сказать какая именно ошибка произошла, так что предыдущий пример, мы рекомендуем больше чем этот. Зачастую, когда происходит ошибка, вам нужно уведомить пользователя, при помощи сообщения.
В зависимости от сложности данной ошибки, вам может понадобиться выйти из программы. Иногда вам может понадобиться выполнить очистку, перед выходом из программы. Например, если вы открыли соединение с базой данных, вам нужно будет закрыть его, перед выходом из программы, или вы можете закончить с открытым соединением. Другой пример – закрытие дескриптора файла, к которому вы обращаетесь. Теперь нам нужно научиться убирать за собой. Это очень просто, если использовать оператор finally.
Оператор finally
Оператор finally очень прост в использовании. Давайте взглянем на нижеизложенный пример:
|
my_dict = {«a»:1, «b»:2, «c»:3} try: value = my_dict[«d»] except KeyError: print(«A KeyError occurred!») finally: print(«The finally statement has executed!») |
Если вы запустите это код, оно отобразиться и в операторе except и в finally. Весьма просто, не так ли? Теперь вы можете использовать оператор finally, чтобы убрать за собой. Вы можете также вписать код exit в конце оператора finally.
Попробуйте except или else
Оператор try/except также имеет пункт else. Он работает только в том случае, если в вашем коде нет ни единой ошибки. Давайте потратим немного времени и взглянем на парочку примеров:
|
my_dict = {«a»:1, «b»:2, «c»:3} try: value = my_dict[«a»] except KeyError: print(«A KeyError occurred!») else: print(«No error occurred!») |
Мы видим словарь, состоящий из трех элементов, и в операторе try/except мы открываем доступ к существующему ключу. Это работает, так что ошибка KeyError не возникает. Так как ошибки нет, else работает, и надпись“No error occurred!” появляется на экране. Теперь добавим оператор finally:
|
my_dict = {«a»:1, «b»:2, «c»:3} try: value = my_dict[«a»] except KeyError: print(«A KeyError occurred!») else: print(«No error occurred!») finally: print(«The finally statement ran!») |
В данном коде работают и оператор else и finally. Большую часть времени вы не будете сталкиваться с оператором else, используемый в том или ином коде, который следует за оператором try/except, если ни одна ошибка не была найдена. Единственное полезное применение оператора else, которое я видел, это когда вы хотите запустить вторую часть кода, в которой может быть ошибка. Конечно, если ошибка возникает в else, то она не будет поймана.
Подведем итоги
Теперь вы можете выявлять исключения в вашем коде. Если вы обнаружили, что в вашем коде есть ошибка, то теперь вы знаете, как выявить её и спокойно выйти из программы, или продолжить спокойно работать.

Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»
Урок 18. Exceptions.
Что вы предпринимаете, когда с работой вашей программы что-то идет не так? Допустим, вы пытаетесь открыть файл, но вы ввели неверный путь, или вы хотите узнать информацию у пользователей и они пишут какую-то бессмыслицу. Вы не хотите, чтобы ваша программа крэшилась, по-этому вы выполняете обработку исключений. В Пайтоне, конструкция всегда обернута в то, что называется try/except.
Иерархия исключений выглядит вот так:
Начнем со знакомства с самыми обычными исключениями, которые вы увидите в Пайтоне. Обратите внимание на то, что ошибка и исключение – два разных слова, описывающие одно и то же, в контексте обработки исключений.
Основные исключения
Ниже изложен список основных встроенных исключений (определение в документации к Пайтону):
Exception – то, на чем фактически строятся все остальные ошибки;
AttributeError – возникает, когда ссылка атрибута или присвоение не могут быть выполнены;
IOError – возникает в том случае, когда операция I/O (такая как оператор вывода, встроенная функция open() или метод объекта-файла) не может быть выполнена, по связанной с I/O причине: «файл не найден», или «диск заполнен», иными словами.
ImportError – возникает, когда оператор import не может найти определение модуля, или когда оператор не может найти имя файла, который должен быть импортирован;
IndexError – возникает, когда индекс последовательности находится вне допустимого диапазона;
KeyError – возникает, когда ключ сопоставления (dictionary key) не найден в наборе существующих ключей;
KeyboardInterrupt – возникает, когда пользователь нажимает клавишу прерывания(обычно Delete или Ctrl+C);
NameError – возникает, когда локальное или глобальное имя не найдено;
OSError – возникает, когда функция получает связанную с системой ошибку;
SyntaxError — возникает, когда синтаксическая ошибка встречается синтаксическим анализатором;
TypeError – возникает, когда операция или функция применяется к объекту несоответствующего типа. Связанное значение представляет собой строку, в которой приводятся подробные сведения о несоответствии типов;
ValueError – возникает, когда встроенная операция или функция получают аргумент, тип которого правильный, но неправильно значение, и ситуация не может описано более точно, как при возникновении IndexError;
ZeroDivisionError – возникает, когда второй аргумент операции division или modulo равен нулю;
Существует много других исключений, но вы вряд ли будете сталкиваться с ними так же часто.
Как обрабатывать исключения?
Обработка исключений в Пайтон – это очень просто. Потратим немного времени и напишем несколько примеров, которые их вызовут. Мы начнем с одной из самых элементарных проблем: деление на ноль.
Traceback (most recent call last): File "<string>", line 1, in <fragment> ZeroDivisionError: integer division or modulo by zero
try: 1 / 0 except ZeroDivisionError: print("You cannot divide by zero!")
>>> You cannot divide by zero!
Если мы обратимся к урокам элементарной математики, то вспомним, что на ноль делить нельзя. В Пайтоне данная операция вызовет ошибку, как мы можем видеть в примере выше. Чтобы поймать ошибку, мы завернем операцию в оператор try/except.
«Голое» исключение
Есть еще один способ поймать ошибку:
try: 1 / 0 except: print("You cannot divide by zero!") # ЭТО СРАБОТАЕТ, НО ТАК ДЕЛАТЬ НЕЛЬЗЯ
На жаргоне Пайтона, это известно как голое исключение, что означает, что будут найдены вообще все исключения. Причина, по которой так делать не рекомендуется, заключается в том, что вы не узнаете, что именно за исключение вы выловите. Когда у вас возникло что-то в духе ZeroDivisionError, вы хотите выявить фрагмент, в котором происходит деление на ноль. В коде, написанном выше, вы не можете указать, что именно вам нужно выявить. Давайте взглянем еще на несколько примеров:
my_dict = {"a":1, "b":2, "c":3} try: value = my_dict["d"] except KeyError: print("That key does not exist!")
my_list = [1, 2, 3, 4, 5] try: my_list[6] except IndexError: print("That index is not in the list!")
В первом примере, мы создали словарь из трех элементов. После этого, мы попытались открыть доступ ключу, которого в словаре нет. Так как ключ не в словаре, возникает KeyError, которую мы выявили. Второй пример показывает список, длина которого состоит из пяти объектов. Мы попытались взять седьмой объект из индекса.
Помните, что списки в Пайтоне начинаются с нуля, так что когда вы говорите 6, вы запрашиваете 7. В любом случае, в нашем списке только пять объектов, по этой причине возникает IndexError, которую мы выявили. Вы также можете выявить несколько ошибок за раз при помощи одного оператора. Для этого существует несколько различных способов. Давайте посмотрим:
my_dict = {"a":1, "b":2, "c":3} try: value = my_dict["d"] except IndexError: print("This index does not exist!") except KeyError: print("This key is not in the dictionary!") except: print("Some other error occurred!")
Это самый стандартный способ выявить несколько исключений. Сначала мы попробовали открыть доступ к несуществующему ключу, которого нет в нашем словаре. При помощи try/except мы проверили код на наличие ошибки KeyError, которая находится во втором операторе except. Обратите внимание на то, что в конце кода у нас появилась «голое» исключение. Обычно, это не рекомендуется, но вы, возможно, будете сталкиваться с этим время от времени, так что лучше быть проинформированным об этом. Кстати, также обратите внимание на то, что вам не нужно использовать целый блок кода для обработки нескольких исключений. Обычно, целый блок используется для выявления одного единственного исключения. Изучим второй способ выявления нескольких исключений:
try: value = my_dict["d"] except IndexError, KeyError: print("An IndexError or KeyError occurred!")
Обратите внимание на то, что в данном примере мы помещаем ошибки, которые мы хотим выявить, внутри круглых скобок. Проблема данного метода в том, что трудно сказать какая именно ошибка произошла, так что предыдущий пример, мы рекомендуем больше чем этот. Зачастую, когда происходит ошибка, вам нужно уведомить пользователя, при помощи сообщения.
В зависимости от сложности данной ошибки, вам может понадобиться выйти из программы. Иногда вам может понадобиться выполнить очистку, перед выходом из программы. Например, если вы открыли соединение с базой данных, вам нужно будет закрыть его, перед выходом из программы, или вы можете закончить с открытым соединением. Другой пример – закрытие дескриптора файла, к которому вы обращаетесь. Теперь нам нужно научиться убирать за собой. Это очень просто, если использовать оператор finally.
Оператор finally
Оператор finally очень прост в использовании. Давайте взглянем на нижеизложенный пример:
my_dict = {"a":1, "b":2, "c":3} try: value = my_dict["d"] except KeyError: print("A KeyError occurred!") finally: print("The finally statement has executed!")
Если вы запустите это код, оно отобразиться и в операторе except и в finally. Весьма просто, не так ли? Теперь вы можете использовать оператор finally, чтобы убрать за собой. Вы можете также вписать код exit в конце оператора finally.
Попробуйте except или else
Оператор try/except также имеет пункт else. Он работает только в том случае, если в вашем коде нет ни единой ошибки. Давайте потратим немного времени и взглянем на парочку примеров:
my_dict = {"a":1, "b":2, "c":3} try: value = my_dict["a"] except KeyError: print("A KeyError occurred!") else: print("No error occurred!")
Мы видим словарь, состоящий из трех элементов, и в операторе try/except мы открываем доступ к существующему ключу. Это работает, так что ошибка KeyError не возникает. Так как ошибки нет, else работает, и надпись “No error occurred!” появляется на экране. Теперь добавим оператор finally:
my_dict = {"a":1, "b":2, "c":3} try: value = my_dict["a"] except KeyError: print("A KeyError occurred!") else: print("No error occurred!") finally: print("The finally statement ran!")
В данном коде работают и оператор else и finally. Большую часть времени вы не будете сталкиваться с оператором else, используемый в том или ином коде, который следует за оператором try/except, если ни одна ошибка не была найдена. Единственное полезное применение оператора else, которое я видел, это когда вы хотите запустить вторую часть кода, в которой может быть ошибка. Конечно, если ошибка возникает в else, то она не будет поймана.
Оператор raise
Если в вашем коде какие-либо данные не соответсвуют вашим ожиданиям, вы всегда можете вызвать исключение если вам это необходимо, для этого используется ключевое слово raise.
def even_the_odds(odds): if odds % 2 != 1: raise ValueError("Did not get an odd number") return odds + 1
Любое исключение завершает наш код, а значит, что до возврата в случае исключения функция не дойдет.
Мы можем использовать raise внутри любой конструкции, допустим нам нужно отправлять ошибку на сторонний сервис, но не обрабатывать её
try: do_stuff(resource) except SomeException as e: log_error(e) raise # re-raise the error finally: free_expensive_resource(resource)
raise в этом случае просто повторится
еще один такой пример
try: 5 / 0 except ZeroDivisionError: print("Got an error") raise
Имейте в виду, однако, что кто-то еще выше в стеке вызовов может все же перехватить исключение и как-то обработать его. Готовый вывод может быть неприятным в этом случае, потому что это произойдет в любом случае (пойман или не пойман). Поэтому может быть лучше создать другое исключение, содержащее ваш комментарий о ситуации, а также исходное исключение:
try: 5 / 0 except ZeroDivisionError as e: raise ZeroDivisionError("Got an error", e)
в переменной e будет хранится вся информация о исключении, и таким рейзом мы вызовем нужный нам тип исключения, с нашим коментарием, и всей системной информацией.
Исключения тоже объекты
Исключением являются только обычные объекты Python , которые наследуют от встроенного BaseException . Сценарий Python может использовать raise заявление , чтобы прервать выполнение, в результате чего Python для печати трассировки стеки из стека вызовов в этой точке и представление экземпляра исключения.
Например:
>>> def failing_function(): ... raise ValueError('Example error!') >>> failing_function() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in failing_function ValueError: Example error!
который говорит , что ValueError с сообщением ‘Example error!’ был поднят нашей failing_function() , который был выполнен в интерпретаторе.
Код вызова может выбрать обработку любых исключений, которые может вызвать вызов:
>>> try: ... failing_function() ... except ValueError: ... print('Handled the error') Handled the error
Или вывесли оригинальный текст:
>>> try: ... failing_function() ... except ValueError as e: ... print('Caught exception', repr(e)) Caught exception ValueError('Example error!',)
Создание пользовательских типов исключений
Создайте класс , унаследованный от Exception :
class FooException(Exception): pass try: raise FooException("insert description here") except FooException: print("A FooException was raised.")
или другой тип исключения:
class NegativeError(ValueError): pass def foo(x): # function that only accepts positive values of x if x < 0: raise NegativeError("Cannot process negative numbers") ... # rest of function body try: result = foo(int(input("Enter a positive integer: "))) # raw_input in Python 2.x except NegativeError: print("You entered a negative number!") else: print("The result was " + str(result))