Учебники

Python 3 — Обработка исключений

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

Обработка исключений — это будет описано в этом руководстве. Вот список стандартных исключений, доступных в Python — Стандартные исключения .

Утверждения — это будет описано в руководстве по утверждениям в Python 3 .

Стандартные исключения

Вот список стандартных исключений, доступных в Python.

Sr.No. Название и описание исключения
1

исключение

Базовый класс для всех исключений

2

StopIteration

Возникает, когда метод next () итератора не указывает ни на один объект.

3

SystemExit

Вызывается функцией sys.exit ().

4

Стандартная ошибка

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

5

ArithmeticError

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

6

OverflowError

Возникает, когда расчет превышает максимальный предел для числового типа.

7

FloatingPointError

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

8

ZeroDivisonError

Возникает, когда деление или деление на ноль происходит для всех числовых типов.

9

AssertionError

Вызывается в случае сбоя утверждения Assert.

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

Возникает при сбое операции ввода / вывода, такой как оператор print или функция open (), при попытке открыть файл, который не существует.

21

OSError

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

22

Ошибка синтаксиса

Возникает при возникновении ошибки в синтаксисе Python.

23

IndentationError

Поднимается, если отступ не указан правильно.

24

Системная ошибка

Возникает, когда интерпретатор обнаруживает внутреннюю проблему, но при обнаружении этой ошибки интерпретатор Python не завершается.

25

SystemExit

Возникает при выходе из интерпретатора Python с помощью функции sys.exit (). Если не обрабатывается в коде, интерпретатор завершает работу.

26

TypeError

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

27

ValueError

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

28

Ошибка выполнения

Возникает, когда сгенерированная ошибка не попадает ни в одну категорию.

29

NotImplementedError

Возникает, когда абстрактный метод, который должен быть реализован в унаследованном классе, фактически не реализован.

исключение

Базовый класс для всех исключений

StopIteration

Возникает, когда метод next () итератора не указывает ни на один объект.

SystemExit

Вызывается функцией sys.exit ().

Стандартная ошибка

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

ArithmeticError

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

OverflowError

Возникает, когда расчет превышает максимальный предел для числового типа.

FloatingPointError

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

ZeroDivisonError

Возникает, когда деление или деление на ноль происходит для всех числовых типов.

AssertionError

Вызывается в случае сбоя утверждения Assert.

AttributeError

Возникает в случае сбоя ссылки на атрибут или присвоения.

EOFError

Возникает, когда нет ввода ни от функции raw_input (), ни от input () и достигнут конец файла.

ImportError

Возникает при сбое оператора импорта.

KeyboardInterrupt

Возникает, когда пользователь прерывает выполнение программы, обычно нажатием Ctrl + c.

LookupError

Базовый класс для всех ошибок поиска.

IndexError

Возникает, когда индекс не найден в последовательности.

KeyError

Возникает, когда указанный ключ не найден в словаре.

NameError

Возникает, когда идентификатор не найден в локальном или глобальном пространстве имен.

UnboundLocalError

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

EnvironmentError

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

IOError

Возникает при сбое операции ввода / вывода, такой как оператор print или функция open (), при попытке открыть файл, который не существует.

OSError

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

Ошибка синтаксиса

Возникает при возникновении ошибки в синтаксисе Python.

IndentationError

Поднимается, если отступ не указан правильно.

Системная ошибка

Возникает, когда интерпретатор обнаруживает внутреннюю проблему, но при обнаружении этой ошибки интерпретатор Python не завершается.

SystemExit

Возникает при выходе из интерпретатора Python с помощью функции sys.exit (). Если не обрабатывается в коде, интерпретатор завершает работу.

TypeError

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

ValueError

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

Ошибка выполнения

Возникает, когда сгенерированная ошибка не попадает ни в одну категорию.

NotImplementedError

Возникает, когда абстрактный метод, который должен быть реализован в унаследованном классе, фактически не реализован.

Утверждения в Python

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

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

  • Утверждения выполняются оператором assert, новейшим ключевым словом Python, представленным в версии 1.5.

  • Программисты часто помещают утверждения в начале функции для проверки правильности ввода и после вызова функции для проверки правильности вывода.

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

Утверждения выполняются оператором assert, новейшим ключевым словом Python, представленным в версии 1.5.

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

Утверждение утверждения

Когда он встречает утверждение assert, Python оценивает сопровождающее выражение, которое, как мы надеемся, истинно. Если выражение ложно, Python вызывает исключение AssertionError .

Синтаксис для assert —

assert Expression[, Arguments]

Если утверждение не выполняется, Python использует ArgumentExpression в качестве аргумента для AssertionError. Исключения AssertionError могут быть перехвачены и обработаны, как и любое другое исключение, с помощью оператора try-exc. Если они не обрабатываются, они завершат программу и произведут трассировку.

пример

Вот функция, которая преобразует заданную температуру из градусов Кельвина в градусы Фаренгейта. Поскольку 0 ° K настолько холодный, насколько это возможно, функция отключается, если видит отрицательную температуру —

Live Demo

#!/usr/bin/python3

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: включите оператор exc:, а затем блок кода, который обрабатывает проблему максимально элегантно.

Синтаксис

Вот простой синтаксис try …. кроме … 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 может быть несколько операторов, кроме. Это полезно, когда блок try содержит операторы, которые могут выдавать различные типы исключений.

  • Вы также можете предоставить универсальный исключающий пункт, который обрабатывает любое исключение.

  • После предложения (й) исключений вы можете включить предложение else. Код в блоке else выполняется, если код в блоке try: не вызывает исключение.

  • Блок else — это хорошее место для кода, который не нуждается в защите try: block.

У одного оператора try может быть несколько операторов, кроме. Это полезно, когда блок try содержит операторы, которые могут выдавать различные типы исключений.

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

После предложения (й) исключений вы можете включить предложение else. Код в блоке else выполняется, если код в блоке try: не вызывает исключение.

Блок else — это хорошее место для кода, который не нуждается в защите try: block.

пример

Этот пример открывает файл, записывает содержимое в файл, и изящно выходит, потому что нет никаких проблем —

Live Demo

#!/usr/bin/python3

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

пример

В этом примере пытается открыть файл, в котором у вас нет разрешения на запись, поэтому возникает исключение —

Live Demo

#!/usr/bin/python3

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

Исключая оговорку без исключений

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

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-Кроме перехватывает все возникающие исключения. Однако использование этого типа оператора try-exception не считается хорошей практикой программирования, поскольку оно перехватывает все исключения, но не заставляет программиста определить причину проблемы, которая может возникнуть.

Исключая оговорку с несколькими исключениями

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

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.
   ......................

Примечание. Вы можете указать только пункт (ы) или пункт finally, но не оба. Вы не можете использовать предложение else вместе с предложением finally.

пример

Live Demo

#!/usr/bin/python3

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")
   fh.close()

Если у вас нет разрешения на открытие файла в режиме записи, это приведет к следующему результату:

Error: can't find file or read data

Тот же пример можно написать более четко следующим образом:

Live Demo

#!/usr/bin/python3

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

Это дает следующий результат —

Going to close the file

Когда в блоке try создается исключение, выполнение немедленно передается блоку finally . После того, как все операторы в блоке finally выполнены, исключение вызывается снова и обрабатывается в операторах исключения, если оно присутствует на следующем более высоком уровне оператора try- exc.

Аргумент Исключения

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

try:
   You do your operations here
   ......................
except ExceptionType as Argument:
   You can print value of Argument here...

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

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

пример

Ниже приведен пример для одного исключения —

Live Demo

#!/usr/bin/python3

# Define a function here.
def temp_convert(var):
   try:
      return int(var)
   except ValueError as 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 [Exception [, args [, traceback]]]

Здесь Exception — это тип исключения (например, NameError), а аргумент — это значение для аргумента исключения. Аргумент необязательный; если не указан, аргумент исключения — None.

Последний аргумент, traceback, также является необязательным (и редко используется на практике) и, если присутствует, является объектом трассировки, используемым для исключения.

пример

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

def functionName( level ):
   if level <1:
      raise Exception(level)
      # The code below to this would not be executed
      # if we raise the exception
   return level

Примечание. Чтобы перехватить исключение, предложение «кроме» должно ссылаться на то же исключение, выбрасываемое либо как объект класса, либо как простая строка. Например, чтобы перехватить вышеупомянутое исключение, мы должны написать предложение исключение следующим образом:

try:
   Business Logic here...
except Exception as e:
   Exception handling here using e.args...
else:
   Rest of the code here...

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

Live Demo

#!/usr/bin/python3

def functionName( level ):
   if level <1:
      raise Exception(level)
      # The code below to this would not be executed
      # if we raise the exception
   return level

try:
   l = functionName(-10)
   print ("level = ",l)
except Exception as e:
   print ("error in level argument",e.args[0])

Это даст следующий результат

error in level argument -10

Определяемые пользователем исключения

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

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

В блоке try определенное пользователем исключение возникает и перехватывается в блоке exc. Переменная e используется для создания экземпляра класса Networkerror .

class Networkerror(RuntimeError):
   def __init__(self, arg):
      self.args = arg

Поэтому, как только вы определили вышеприведенный класс, вы можете вызвать исключение следующим образом: