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

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