Python - обработка исключений
Python предоставляет две очень важные функции для обработки любых неожиданных ошибок в ваших программах Python и для добавления в них возможностей отладки:
Exception Handling- Это будет рассмотрено в этом руководстве. Вот список стандартных исключений, доступных в Python: Стандартные исключения .
Assertions- Это будет рассмотрено в учебнике « Утверждения в Python» .
Список стандартных исключений -
Sr. No. | Имя и описание исключения |
---|---|
1 | Exception Базовый класс для всех исключений |
2 | StopIteration Возникает, когда метод next () итератора не указывает ни на какой объект. |
3 | SystemExit Вызывается функцией sys.exit (). |
4 | StandardError Базовый класс для всех встроенных исключений, кроме StopIteration и SystemExit. |
5 | ArithmeticError Базовый класс для всех ошибок, возникающих при числовых вычислениях. |
6 | OverflowError Возникает, когда вычисление превышает максимальный предел для числового типа. |
7 | FloatingPointError Возникает при сбое вычисления с плавающей запятой. |
8 | ZeroDivisionError Возникает, когда деление или по модулю на ноль имеет место для всех числовых типов. |
9 | AssertionError Возникает в случае сбоя утверждения утверждения. |
10 | AttributeError Возникает в случае сбоя ссылки или присвоения атрибута. |
11 | EOFError Возникает, когда нет ввода ни от функции raw_input (), ни от функции input () и достигнут конец файла. |
12 | ImportError Возникает при сбое инструкции импорта. |
13 | KeyboardInterrupt Возникает, когда пользователь прерывает выполнение программы, обычно нажатием Ctrl + c. |
14 | LookupError Базовый класс для всех ошибок поиска. |
15 | IndexError Возникает, когда индекс не найден в последовательности. |
16 | KeyError Возникает, когда указанный ключ не найден в словаре. |
17 | NameError Возникает, когда идентификатор не найден в локальном или глобальном пространстве имен. |
18 | UnboundLocalError Возникает при попытке доступа к локальной переменной в функции или методе, но ей не было присвоено значение. |
19 | EnvironmentError Базовый класс для всех исключений, возникающих за пределами среды Python. |
20 | IOError Возникает при сбое операции ввода / вывода, например при выполнении оператора печати или функции open () при попытке открыть файл, который не существует. |
21 год | IOError Поднят за ошибки, связанные с операционной системой. |
22 | SyntaxError Возникает, когда в синтаксисе Python есть ошибка. |
23 | IndentationError Возникает, если отступ не указан правильно. |
24 | SystemError Возникает, когда интерпретатор обнаруживает внутреннюю проблему, но при обнаружении этой ошибки интерпретатор Python не завершает работу. |
25 | SystemExit Возникает при выходе из интерпретатора Python с помощью функции sys.exit (). Если не обрабатывается в коде, вызывает завершение работы интерпретатора. |
26 | TypeError Возникает при попытке выполнения операции или функции, недопустимой для указанного типа данных. |
27 | ValueError Возникает, когда встроенная функция для типа данных имеет допустимый тип аргументов, но аргументы имеют недопустимые значения. |
28 | RuntimeError Возникает, когда сгенерированная ошибка не попадает ни в одну категорию. |
29 | NotImplementedError Возникает, когда абстрактный метод, который необходимо реализовать в унаследованном классе, фактически не реализован. |
Утверждения в Python
Утверждение - это проверка работоспособности, которую вы можете включить или выключить, когда закончите тестирование программы.
Самый простой способ придумать утверждение - это сравнить его с утверждением. raise-ifзаявление (или, чтобы быть точнее, заявление о повышении, если нет). Выражение проверяется, и если результат оказывается ложным, возникает исключение.
Утверждения выполняются с помощью оператора assert, новейшего ключевого слова Python, представленного в версии 1.5.
Программисты часто помещают утверждения в начале функции для проверки правильности ввода и после вызова функции для проверки правильности вывода.
Утверждают Заявление
Когда он встречает утверждение assert, Python оценивает сопутствующее выражение, которое, надеюсь, верно. Если выражение ложно, Python вызывает исключение AssertionError .
В syntax ибо утверждение - это -
assert Expression[, Arguments]
Если утверждение не выполняется, Python использует ArgumentExpression в качестве аргумента для AssertionError. Исключения AssertionError можно перехватывать и обрабатывать, как любое другое исключение, с помощью оператора try-except, но если не обработать, они завершат программу и произведут обратную трассировку.
пример
Вот функция, которая преобразует температуру из градусов Кельвина в градусы Фаренгейта. Так как ноль градусов Кельвина настолько холодно, насколько это возможно, функция срабатывает, если обнаруживает отрицательную температуру -
#!/usr/bin/python
def KelvinToFahrenheit(Temperature):
assert (Temperature >= 0),"Colder than absolute zero!"
return ((Temperature-273)*1.8)+32
print KelvinToFahrenheit(273)
print int(KelvinToFahrenheit(505.78))
print KelvinToFahrenheit(-5)
Когда приведенный выше код выполняется, он дает следующий результат:
32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!
Что такое исключение?
Исключением является событие, которое происходит во время выполнения программы, которое нарушает нормальный поток инструкций программы. Как правило, когда сценарий Python сталкивается с ситуацией, с которой он не может справиться, он вызывает исключение. Исключением является объект Python, представляющий ошибку.
Когда сценарий Python вызывает исключение, он должен либо немедленно обработать исключение, в противном случае он завершается и завершается.
Обработка исключения
Если у вас есть подозрительный код, который может вызвать исключение, вы можете защитить свою программу, поместив подозрительный код вtry:блок. После блока try: включитеexcept: оператор, за которым следует блок кода, который решает проблему максимально элегантно.
Синтаксис
Вот простой синтаксис блоков try .... except ... else -
try:
You do your operations here;
......................
except ExceptionI:
If there is ExceptionI, then execute this block.
except ExceptionII:
If there is ExceptionII, then execute this block.
......................
else:
If there is no exception then execute this block.
Вот несколько важных моментов о вышеупомянутом синтаксисе:
У одного оператора try может быть несколько операторов except. Это полезно, когда блок try содержит инструкции, которые могут вызывать различные типы исключений.
Вы также можете предоставить универсальное предложение except, которое обрабатывает любое исключение.
После предложений except вы можете включить else-clause. Код в блоке else выполняется, если код в блоке try: не вызывает исключения.
Блок else - хорошее место для кода, который не нуждается в защите try: block.
пример
Этот пример открывает файл, записывает содержимое в файл и выходит изящно, потому что проблем нет вообще -
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
except IOError:
print "Error: can\'t find file or read data"
else:
print "Written content in the file successfully"
fh.close()
Это дает следующий результат -
Written content in the file successfully
пример
В этом примере пытается открыть файл, в котором у вас нет разрешения на запись, поэтому возникает исключение -
#!/usr/bin/python
try:
fh = open("testfile", "r")
fh.write("This is my test file for exception handling!!")
except IOError:
print "Error: can\'t find file or read data"
else:
print "Written content in the file successfully"
Это дает следующий результат -
Error: can't find file or read data
За исключением пункта с исключениями Нет
Вы также можете использовать оператор except без исключений, определенных следующим образом:
try:
You do your operations here;
......................
except:
If there is any exception, then execute this block.
......................
else:
If there is no exception then execute this block.
Это своего рода try-exceptоператор перехватывает все возникающие исключения. Однако использование такого оператора try-except не считается хорошей практикой программирования, поскольку он улавливает все исключения, но не заставляет программиста идентифицировать основную причину проблемы, которая может возникнуть.
Предложение except с несколькими исключениями
Вы также можете использовать тот же оператор except для обработки нескольких исключений следующим образом:
try:
You do your operations here;
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
If there is any exception from the given exception list,
then execute this block.
......................
else:
If there is no exception then execute this block.
Оговорка о попытках
Вы можете использовать finally: блок вместе с try:блок. Блок finally - это место для размещения любого кода, который должен выполняться, независимо от того, вызвал ли блок try исключение или нет. Синтаксис оператора try-finally следующий:
try:
You do your operations here;
......................
Due to any exception, this may be skipped.
finally:
This would always be executed.
......................
Вы не можете использовать предложение else вместе с предложением finally.
пример
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
finally:
print "Error: can\'t find file or read data"
Если у вас нет разрешения на открытие файла в режиме записи, это приведет к следующему результату:
Error: can't find file or read data
Тот же пример можно записать более чисто следующим образом:
#!/usr/bin/python
try:
fh = open("testfile", "w")
try:
fh.write("This is my test file for exception handling!!")
finally:
print "Going to close the file"
fh.close()
except IOError:
print "Error: can\'t find file or read data"
Когда в блоке try возникает исключение , выполнение немедленно переходит к блоку finally . После того, как все операторы в блоке finally выполнены, исключение возникает снова и обрабатывается в операторах except, если они присутствуют на следующем более высоком уровне оператора try-except .
Аргумент исключения
У исключения может быть аргумент , представляющий собой значение, дающее дополнительную информацию о проблеме. Содержание аргумента зависит от исключения. Вы захватываете аргумент исключения, предоставляя переменную в предложении except следующим образом:
try:
You do your operations here;
......................
except ExceptionType, Argument:
You can print value of Argument here...
Если вы пишете код для обработки одного исключения, вы можете указать переменную после имени исключения в операторе except. Если вы перехватываете несколько исключений, вы можете сделать так, чтобы переменная следовала за кортежем исключения.
Эта переменная получает значение исключения, в основном содержащее причину исключения. Переменная может принимать одно значение или несколько значений в виде кортежа. Этот кортеж обычно содержит строку ошибки, номер ошибки и местоположение ошибки.
пример
Ниже приведен пример единственного исключения -
#!/usr/bin/python
# Define a function here.
def temp_convert(var):
try:
return int(var)
except ValueError, Argument:
print "The argument does not contain numbers\n", Argument
# Call above function here.
temp_convert("xyz");
Это дает следующий результат -
The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'
Вызов исключения
Вы можете вызвать исключения несколькими способами, используя оператор raise. Общий синтаксис дляraise Заявление выглядит следующим образом.
Синтаксис
raise [Exception [, args [, traceback]]]
Здесь Exception - это тип исключения (например, NameError), а arguments - значение аргумента исключения. Аргумент не обязателен; если не указан, аргумент исключения - Нет.
Последний аргумент, трассировка, также является необязательным (и редко используется на практике), и, если он присутствует, это объект трассировки, используемый для исключения.
пример
Исключением может быть строка, класс или объект. Большинство исключений, которые вызывает ядро Python, - это классы с аргументом, который является экземпляром класса. Определение новых исключений довольно просто и может быть выполнено следующим образом:
def functionName( level ):
if level < 1:
raise "Invalid level!", level
# The code below to this would not be executed
# if we raise the exception
Note:Чтобы перехватить исключение, предложение «except» должно ссылаться на одно и то же исключение, созданное либо объектом класса, либо простой строкой. Например, чтобы зафиксировать указанное выше исключение, мы должны написать предложение except следующим образом:
try:
Business Logic here...
except "Invalid level!":
Exception handling here...
else:
Rest of the code here...
Пользовательские исключения
Python также позволяет создавать собственные исключения, производя классы из стандартных встроенных исключений.
Вот пример, связанный с RuntimeError . Здесь создается класс, унаследованный от RuntimeError . Это полезно, когда вам нужно отобразить более конкретную информацию при обнаружении исключения.
В блоке try вызывается определенное пользователем исключение и перехватывается в блоке except. Переменная e используется для создания экземпляра класса Networkerror .
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
Итак, как только вы определили класс выше, вы можете вызвать исключение следующим образом:
try:
raise Networkerror("Bad hostname")
except Networkerror,e:
print e.args