Последние новости:

Поиск по сайту:

Человек может то, что он должен (И. Фихте).

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:
   Это всегда будет исполнено.
   ......................

 

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

Пример

#!/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

 

Примечание:
Для того, чтобы поймать исключение, заявление «except» должно ссылаться на то же исключение, указанное либо как объект класса или простую строку.

Например, чтобы захватить исключение выше, мы должны написать пункт 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.

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

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

5 1 голос
Рейтинг статьи
Подписаться
Уведомить о
guest

**ссылки nofollow

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Статьи партнеров:

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам:

Заполните форму и наш менеджер перезвонит Вам в самое ближайшее время!

badge
Обратный звонок 1
Отправить

Спасибо! Ваша заявка принята

close

Спасибо! Ваша заявка принята

close