Поиск по сайту:
Почему нас раздражает чужое самолюбование? Довольно очевидно (Авессалом Подводный).

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

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...
02.11.2017
Python 3 - Обработка исключений

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

  • Обработка исключений — Будет охвачена в этом руководстве. Список стандартных исключений, доступных в Python будет рассмотрен здесь.
  • Утверждения — Будет рассмотрено в учебнике об утверждениях в Python 3.

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

Ниже приведен список стандартных исключений доступных в Python:

Имя и Описание исключений
1Exception — Базовый класс для всех исключений
2StopIteration — Возникает, когда метод next() цикла не указывает на какой-либо объект.
3SystemExit — Вызываемая функция sys.exit().
4StandardError — Базовый класс для всех встроенных исключений, кроме StopIteration и SystemExit.
5ArithmeticError — Базовый класс для всех ошибок, которые возникают для числовых расчетов.
6OverflowError — Возникает, когда значение превышает максимальный предел для числового типа.
7FloatingPointError — Возникает, когда расчет с плавающей точкой терпит неудачу.
8ZeroDivisonError — Возникает при делении или по модулю нуля, имеет место для всех числовых типов.
9AssertionError — Вызывается в случае выхода из строя заявления Assert.
10AttributeError — Вызывается в случае выхода из строя ссылки на атрибут или назначения.
11EOFError — Возникает, когда нет входного сигнала либо из raw_input () или функции inpud() и достигнут конец файла.
12ImportError — Возникает, когда оператор import терпит неудачу.
13KeyboardInterrupt — Возникает, когда пользователь прерывает выполнение программы, как правило, нажав Ctrl + C.
14LookupError — Базовый класс для всех ошибок поиска.
15IndexError — Возникает, когда индекс не найден в последовательности.
16KeyError — Возникает, когда указанный ключ не найден в словаре.
17NameError — Возникает, когда идентификатор не найден в локальных или глобальном пространстве имен.
18UnboundLocalError — Возникает при попытке доступа к локальной переменной в функции или метода, но значение не было присвоено.
19EnvironmentError — Базовый класс для всех исключений, которые происходят за пределами среды Python.
20IOError — Возникает, когда операция ввода/вывода не работает, например, заявление для печати или функции Open() при попытке открыть файл, который не существует.
21OSError — Вызывает ошибку, связанную с операционной системой.
22SyntaxError — Возникает, когда есть ошибка в синтаксисе Python.
23IndentationError — Возникает, когда не указаны правильно отступы.
24SystemError — Возникает, когда интерпретатор находит внутреннюю проблему, но при возникновении этой ошибки интерпретатор Python не выходит.
25SystemExit — Вызывается, когда интерпретатор Python выходит с помощью sys.функции exit(). Если код не обработан, переводчик завершает работу.
26TypeError — Возникает при попытке операции или функции, недопустимой для указанного типа данных.
27ValueError — Возникает, когда встроенная функция для типа данных имеет допустимый тип аргументов, но аргументы имеют недопустимые значения.
28RuntimeError — Возникает, когда генерируется ошибка не попадающая ни в какую категорию.
29NotImplementedError — Возникает, когда абстрактный метод, который должен быть реализован у унаследованного класса фактически не реализуется.

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

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

  • Самый простой способ создать утверждение, является приравнять его к заявление raise-if (или быть более точным, заявление raise-if-not). Выражение проверяется, и если результат приходит ложным, возбуждается исключение.
  • Утверждения выполняются оператором assert, новейшим ключевым словом Python, введенным в версии 1.5.
  • Программисты часто размещают утверждения в начале функции для проверки допустимого ввода и после вызова функции для проверки допустимого вывода.

Заявление assert

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

Синтаксис assert:

assert Expression[, Аргументы]

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

Пример

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

#!/usr/bin/python3
def KelvinToFahrenheit(Temperature):
   assert (Temperature >= 0),"Холоднее абсолютного нуля!"
   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),"Холоднее абсолютного нуля!"
AssertionError: Холоднее абсолютного нуля!

Что такое исключение?

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

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

Обработка исключения

Если у вас есть какой-то подозрительный код, который может вызвать исключение, вы можете защитить свою программу путем размещения подозрительного кода в блоке try:. Блок try: включает в себя, заявление except:, следует блок кода, который обрабатывает проблему как можно элегантнее.

Синтаксис

Вот простой синтаксис блоков try….except…else:

try:
   Вы делаете свою работу
   ......................
except ExceptionI:
   Если есть ExceptionI, то выполняется этот блок.
except ExceptionII:
   Если есть ExceptionII, то выполняется этот блок.
   ......................
else:
   Если исключений нет, выполняется этот блок.

 

Вот несколько важных моментов, о вышеупомянутом синтаксисе:

  • Один оператор может попытаться иметь несколько заявлений. Это полезно, когда блок попытка содержит заявления, которые могут бросить различные типы исключений.
  • Кроме того, можно предоставить универсальное предложение, которое обрабатывает любое исключение.
  • После класса except, можно добавить класс else. Код else-block выполниться, если код в блоке try: не вызывает исключение.
  • else-block является хорошим местом для кода, который не нужно попробовать: защита блока.

Пример

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

#!/usr/bin/python3

try:
   fh = open("testfile", "w")
   fh.write("Это мой тестовый файл для обработки исключений!!")
except IOError:
   print ("Ошибка: не удается найти файл или прочитать данные")
else:
   print ("Запись содержимого в файл произведена успешно")
   fh.close()

 

Данный код выдаст следующий результат:

Запись содержимого в файл произведена успешно

Пример

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

#!/usr/bin/python3

try:
   fh = open("testfile", "r")
   fh.write("Это мой тестовый файл для обработки исключений!!")
except IOError:
   print ("Ошибка: не удается найти файл или прочитать данные")
else:
   print ("Запись содержимого в файл произведена успешно")

 

Данный код выдаст следующий результат:

Ошибка: не удается найти файл или прочитать данные

Класс except без исключений

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

try:
   Вы делаете свою работу
   ......................
except:
   Если есть какие-либо исключения, то выполняется этого блока.
   ......................
else:
   Если исключений нет, выполняется этот блок.

 

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

Класс except с несколькими исключениями

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

try:
   Вы делаете свою работу
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   Если есть какое-либо исключение из данного списка исключений, 
   то выполняется этот блок.
   ......................
else:
   Если исключений нет, выполняется этот блок.

 

Класс try-finally

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

try:
   Вы делаете свою работу;
   ......................
   Из-за каких-либо исключений, это может быть пропущено.
finally:
   Это всегда будет исполнено.
   ......................

 

[gn_box title=»Примечание:» box_color=»#91b5ff»]Вы можете указать за предложением except или классом finally, но не оба. Нельзя использовать предложение else  вместе с предложением finally.[/gn_box]

Пример

#!/usr/bin/python3

try:
   fh = open("testfile", "w")
   fh.write("Это мой тестовый файл для обработки исключений!!")
finally:
   print ("Ошибка: не удается найти файл или прочитать данные")
   fh.close()

 

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

Ошибка: не удается найти файл или прочитать данные

 

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

#!/usr/bin/python3

try:
   fh = open("testfile", "w")
   try:
      fh.write("Это мой тестовый файл для обработки исключений!!")
   finally:
      print ("Собираюсь закрыть файл")
      fh.close()
except IOError:
   print ("Ошибка: не удается найти файл или прочитать данные")

 

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

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

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

try:
   Вы делаете свою работу
   ......................
except ExceptionType as Argument:
   Значение аргумента можно напечатать здесь...

 

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

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

Пример

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

#!/usr/bin/python3

# Определить функцию.
def temp_convert(var):
   try:
      return int(var)
   except ValueError as Argument:
      print ("Аргумент не содержит чисел\n", Argument)

# Вызов функции выше здесь.
temp_convert("xyz")

 

Данный код выдаст следующий результат:

Аргумент не содержит чисел
invalid literal for int() with base 10: 'xyz'

Исключение raise

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

Синтаксис

raise [Exception [, args [, traceback]]]

 

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

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

Пример

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

def functionName( level ):
   if level <1:
      raise Exception(level)
      # Приведенный ниже код не будет выполнен
      # если мы вызовем исключение
   return level

 

[gn_box title=»Примечание:» box_color=»#91b5ff»] Для того, чтобы поймать исключение, заявление «except» должно ссылаться на то же исключение, указанное либо как объект класса или простую строку. [/gn_box]

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

try:
   Бизнес-логика здесь...
except Exception as e:
   Обработка исключений здесь e.args...
else:
   Остальная часть кода здесь...

 

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

#!/usr/bin/python3
def functionName( level ):
   if level <1:
      raise Exception(level)
      # Приведенный ниже код не будет выполнен
      # если мы вызовем исключение
   return level

try:
   l = functionName(-10)
   print ("level = ",l)
except Exception as e:
   print ("ошибка в аргументе уровня",e.args[0])

 

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

ошибка в аргументе уровня -10

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

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

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

В блоке try , определенный пользователем возбуждаются исключение и ловится за блоком except. Переменная е используются для создания экземпляра класса NetworkError.

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

 

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

try:
   raise Networkerror("Плохое имя хоста")
except Networkerror,e:
   print e.args

 

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Если статья понравилась, то поделитесь ей в социальных сетях:

Читайте также


Deprecated: Функция WP_Query вызвана с аргументом, который считается устаревшим с версии 3.1.0! Параметр caller_get_posts считается устаревшим. Используйте ignore_sticky_posts. in /var/www/andreyex/data/www/andreyex.ru/wp-includes/functions.php on line 6085
Python 3 - Обзор
Функция map() в Python

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

**ссылки nofollow

Спасибо!

Теперь редакторы в курсе.