Exception в Python
12 may. 16 18:42 21 dec. 17 13:14
Базовый тип для большинства исключений.
Все встроенные исключения, не являющиеся фатальными (не требуею прерывания работы интерпретатора), наследуются от этого типа.
Все пользовательские исключения также должны наследоваться от данного класса:
class MyException(Exception):
"""Пользовательское исключение."""
+py2.5 Наследуется от BaseException.
Синонимы поиска: Exception, исключения, исключение
В этом разделе: ArithmeticError AssertionError AttributeError BufferError EOFError GeneratorExit ImportError LookupError MemoryError NameError OSError ReferenceError RuntimeError StopAsyncIteration StopIteration SyntaxError SystemError TypeError ValueError Warning
В разделе «BaseException»:
BaseException. args
BaseException.with_traceback
KeyboardInterrupt StandardError SystemExit
Инструкция raise, принудительный вызов исключений в Python.
Инструкция raise
позволяет программисту принудительно вызвать указанное исключение. Например:
>>> raise NameError('HiThere') # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # NameError: HiThere
В общем случае инструкция raise
повторно вызывает последнее исключение, которое было активным в текущей области видимости. Если нужно определить, было ли вызвано исключение, но не обрабатывать его, более простая форма инструкции raise
позволяет повторно вызвать исключение:
try: raise NameError('HiThere') except NameError: print('An exception flew by!') raise # An exception flew by! # Traceback (most recent call last): # File "<stdin>", line 2, in <module> # NameError: HiThere
Если в текущей области видимости не активировано ни одного исключения, то в месте, где указана инструкция raise
, без указания выражения, возникает исключение RuntimeError
, указывающее, что это ошибка.
В противном случае raise
вычисляет первое выражение как объект исключения. Он должен быть подклассом BaseException
или его экземпляром. Если это класс, то экземпляр исключения будет получен при необходимости путем создания экземпляра класса без аргументов.
Тип исключения — это класс экземпляра исключения, а значение — сам экземпляр.
Объект traceback
обычно создается автоматически при возникновении исключения и присоединяется к нему в качестве атрибута __traceback__
, который доступен для записи. Вы можете создать исключение и установить свой собственный traceback
за один шаг, используя метод исключения with_traceback()
, который возвращает тот же экземпляр исключения с его обратной трассировкой стека, установленным в его аргумент, например:
raise Exception("foo occurred").with_traceback(tracebackobj)
Предложение from
используется для цепочки исключений. Если исключение задано, второе выражение должно быть другим классом или экземпляром исключения, который затем будет присоединен к брошенному исключению в качестве атрибута
, который доступен для записи. Если возникшее исключение не обработано, то будут напечатаны оба исключения:
try: print(1 / 0) except Exception as exc: raise RuntimeError("Something bad happened") from exc # Traceback (most recent call last): # File "<stdin>", line 2, in <module> # ZeroDivisionError: division by zero # The above exception was the direct cause of the following exception: # Traceback (most recent call last): # File "<stdin>", line 4, in <module> # RuntimeError: Something bad happened
Подобный механизм работает неявно, если исключение вызывается внутри обработчика исключений или предложения finally
, предыдущее исключение затем присоединяется в качестве атрибута __context__
нового исключения:
try: print(1 / 0) except Exception as exc: raise RuntimeError("Something bad happened") # Traceback (most recent call last): # File "<stdin>", line 2, in <module> # ZeroDivisionError: division by zero # The above exception was the direct cause of the following exception: # Traceback (most recent call last): # File "<stdin>", line 4, in <module> # RuntimeError: Something bad happened
Цепочка исключений может быть явно подавлена указанием None
в предложении from
:
try: print(1 / 0) except Exception as exc: raise RuntimeError("Something bad happened") from None # Traceback (most recent call last): # File "<stdin>", line 4, in <module> # RuntimeError: Something bad happened
Обработка исключений Python — GeeksforGeeks
До сих пор мы изучали базовый Python от набора 1 до набора 4 (набор 1 | набор 2 | набор 3 | набор 4).
В этой статье мы обсудим, как обрабатывать исключения в Python с помощью try. кроме, и, наконец, утверждение с помощью соответствующих примеров.
Ошибка в Python может быть двух типов: синтаксические ошибки и исключения. Ошибки — это проблемы в программе, из-за которых программа останавливает выполнение. С другой стороны, исключения возникают, когда происходят некоторые внутренние события, которые изменяют нормальный ход программы.
Разница между синтаксической ошибкой и исключениями
Синтаксическая ошибка: Как следует из названия, эта ошибка вызвана неправильным синтаксисом в коде. Это приводит к завершению программы.
Example:
Python3
|
Выход:
Exception: Exception — это Synception. привело к ошибке. Эта ошибка не останавливает выполнение программы, однако изменяет ее нормальный ход.
Пример:
Python3
|
Output:
В приведенном выше примере возникла ошибка ZeroDivisionError, поскольку мы пытаемся разделить число на 0.
Примечание: Exception — это базовый класс для всех исключений в Python. Вы можете проверить иерархию исключений здесь.
Операторы Try и Except — перехват исключений
Операторы Try и exclude используются для перехвата и обработки исключений в Python. Операторы, которые могут вызывать исключения, хранятся внутри предложения try, а операторы, обрабатывающие исключение, записываются внутри предложения exclude.
Пример: Попробуем получить доступ к элементу массива, индекс которого выходит за границы, и обработаем соответствующее исключение.
Python3
try : : |
Выход
Второй элемент = 2 Произошла ошибка
В приведенном выше примере операторы, которые могут вызвать ошибку, помещаются внутрь оператора try (второй оператор печати в нашем случае). Второй оператор печати пытается получить доступ к четвертому элементу списка, которого там нет, и это вызывает исключение. Затем это исключение перехватывается оператором exclude.
Перехват особого исключения
Оператор try может иметь более одного предложения exclude для указания обработчиков различных исключений. Обратите внимание, что будет выполнен не более одного обработчика. Например, мы можем добавить IndexError в приведенный выше код. Общий синтаксис для добавления конкретных исключений:
try: # заявления) кроме IndexError: # заявления) кроме ValueError: # оператор(ы)
Пример: Перехват определенного исключения в Python
Python3
|
Output
ZeroDivisionError Occurred and Handled
Если вы прокомментируете строку fun(3), вывод будет
NameError Occured and Handled
Приведенный выше вывод таков, потому что как только python пытается получить доступ к значению b, возникает NameError.
Попробуйте с предложением Else
В python вы также можете использовать предложение else в блоке try-except, которое должно присутствовать после всех предложений исключения. Код входит в блок else только в том случае, если предложение try не вызывает исключения.
Example: Try with else clause
Python3
|
Output:
-5.0 a/b приводит к 0
Ключевое слово finally в Python
Python предоставляет ключевое слово finally, которое всегда выполняется после блоков try и exclude. Последний блок всегда выполняется после нормального завершения блока попытки или после завершения блока попытки из-за некоторого исключения.
Синтаксис:
попытка: # Какой-то код.... кроме: # необязательный блок # Обработка исключения (если требуется) еще: # выполнить, если нет исключения в конце концов: # Some code .....(always executed)
Example:
Python3
|
Вывод:
Нельзя делить на ноль Выполняется всегда
Инициирование исключения
Оператор повышения позволяет программисту вызывать определенное исключение. Единственный аргумент в raise указывает на возбуждаемое исключение. Это должен быть либо экземпляр исключения, либо класс исключения (класс, производный от Exception).
Python3
|
Вывод приведенного выше кода будет просто напечатан как «Исключение», но в последней строке также произойдет ошибка времени выполнения из-за оператора повышения в последней строке. Таким образом, вывод в вашей командной строке будет выглядеть
Трассировка (последний последний вызов): Файл "/home/d6ec14ca595b97bff8d8034bbf212a9f.py", строка 5, вподнять NameError("Привет") # Поднять ошибку NameError: Hi there
Эта статья предоставлена Нихилом Кумаром Сингхом (nickzuck_007)
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.
Как создавать исключения в Python
Введение
Программные приложения не всегда работают идеально. Несмотря на интенсивную отладку и несколько уровней тестирования, приложения по-прежнему не работают. Плохие данные, нарушение сетевого подключения, поврежденные базы данных, нехватка памяти и неожиданные действия пользователя могут помешать нормальной работе приложения. Когда такое событие происходит, и приложение не может продолжать свою работу в обычном режиме, это называется исключением . И задача вашего приложения — и ваша работа как программиста — изящно перехватывать и обрабатывать эти исключения, чтобы ваше приложение продолжало работать.
Что такое исключения Python?
Исключения в приложениях Python могут возникать по многим причинам, указанным выше, и по многим другим; и если они не обрабатываются должным образом, эти исключения могут привести к сбою программы, потере данных или, что еще хуже, повреждению данных. Как разработчик Python, вы должны думать о возможных исключительных ситуациях и включать обработку ошибок в свой код.
К счастью, Python поставляется с надежной системой обработки ошибок. Используя структурированную обработку исключений и набор предопределенных исключений, программы Python могут определять тип ошибки во время выполнения и действовать соответствующим образом. Это могут быть такие действия, как выбор альтернативного пути, использование значений по умолчанию или запрос правильного ввода.
В этой статье показано, как вызывать исключения в коде Python и как обращаться с исключениями.
Разница между синтаксическими ошибками Python и исключениями Python
Прежде чем углубиться, важно понять два типа нежелательных условий в программировании на Python — синтаксическая ошибка и исключение .
Исключение синтаксической ошибки возникает, когда код не соответствует ключевым словам Python, стилю именования или структуре программирования. Интерпретатор видит неверный синтаксис на этапе синтаксического анализа и выдает ошибку 9. 0708 Исключение SyntaxError . Программа останавливается и завершается с ошибкой в том месте, где произошла синтаксическая ошибка. Вот почему синтаксические ошибки — это исключения, которые нельзя обработать.
Вот пример блока кода с синтаксической ошибкой (обратите внимание на отсутствие двоеточия после условия «если» в скобках):
а = 10 б = 20 если (а
Интерпретатор улавливает ошибку и указывает номер строки. Обратите внимание, как это не происходит после синтаксической ошибки:
Файл "test.py", строка 4 если (а
С другой стороны, исключение возникает, когда код не имеет синтаксической ошибки, но сталкивается с другими ошибочными ситуациями. Эти условия могут быть рассмотрены в коде — либо в текущей функции, либо в стеке вызовов. В этом смысле исключения не фатальны. Программа Python может продолжать работать, если она корректно обрабатывает исключение.
Вот пример кода Python, в котором нет синтаксических ошибок. Он пытается выполнить арифметическую операцию над двумя строковыми переменными:
а = 'фу' б = 'бар' печать (а% б)
Вызвано исключение TypeError:
Трассировка (последний вызов последний): Файл "test. py", строка 4, в печать (а% б) TypeError: не все аргументы преобразуются при форматировании строки Процесс завершен с кодом выхода 1
Python выдает исключение TypeError при наличии неправильных типов данных. Подобно TypeError, есть несколько встроенных исключений, например:
.- ModuleNotFoundError
- Ошибка импорта
- Ошибка памяти
- Ошибка ОС
- Системная ошибка
- … И так далее
Полный список исключений можно найти в документации Python.
Как создать исключение в Python
Иногда вам нужно, чтобы Python выдавал пользовательское исключение для обработки ошибок. Вы можете сделать это, проверив условие и вызвав исключение, если условие истинно. Вызванное исключение обычно предупреждает пользователя или вызывающее приложение.
Вы используете ключевое слово «raise» для создания исключения Python вручную. Вы также можете добавить сообщение с описанием исключения
.Вот простой пример: допустим, вы хотите, чтобы пользователь ввел дату. Дата должна быть либо сегодня, либо в будущем. Если пользователь вводит прошлую дату, программа должна вызвать исключение:
.Пример исключения Python Throw
из даты и времени импорта даты и времени текущая_дата = дата/время.сейчас() print("Текущая дата: " + current_date.strftime('%Y-%m-%d')) dateinput = input("Введите дату в формате гггг-мм-дд: ") # Здесь мы не проверяем формат ввода даты date_provided = datetime.strptime (ввод даты, '% Y-% m-% d') print("Указанная дата: " + date_provided.strftime('%Y-%m-%d')) если date_provided.date()
Для проверки кода вводим дату старше текущей. Условие «если» оценивается как истинное и вызывает исключение:
.Текущая дата: 2021-01-24 Введите дату в формате гггг-мм-дд: 2021-01-22 Указана дата: 2021-01-22 Traceback (последний последний вызов): Файл "test.py", строка 13, в поднять исключение ("Указанная дата не может быть в прошлом") Исключение: указанная дата не может быть в прошлом Процесс завершен с кодом выхода 1
Вместо создания общего исключения мы также можем указать для него тип:
если (date_provided. date()
При таком же вводе, как и раньше, Python теперь выдает это исключение:
поднять ValueError ("Указанная дата не может быть в прошлом") ValueError: указанная дата не может быть в прошлом
Использование AssertionError в генерации исключений Python
Другой способ вызвать исключение — использовать утверждение . С утверждением вы подтверждаете истинность условия перед выполнением оператора. Если условие оценивается как истинное, выполняется оператор, и управление переходит к следующему оператору. Однако, если условие оценивается как ложное, программа выдает Ошибка утверждения . На диаграмме ниже показан логический поток:
Используя AssertionError, мы можем переписать фрагмент кода в последнем разделе следующим образом:
из даты и времени импорта даты и времени текущая_дата = дата/время.сейчас() print("Текущая дата: " + current_date.strftime('%Y-%m-%d')) dateinput = input("Введите дату в формате гггг-мм-дд: ") # Здесь мы не проверяем формат ввода даты date_provided = datetime. strptime (ввод даты, '% Y-% m-% d') print("Указанная дата: " + date_provided.strftime('%Y-%m-%d')) assert(date_provided.date() >= current_date.date()), «Указанная дата не может быть в прошлом»
Обратите внимание, как мы удалили условие «если» и теперь утверждаем, что предоставленная дата больше или равна текущей дате. При вводе более старой даты AssertionError отображает:
Текущая дата: 2021-01-24 Введите дату в формате гггг-мм-дд: 2021-01-23 Traceback (последний последний вызов): Указана дата: 2021-01-23 Файл "test.py", строка 12, в assert(date_provided.date() >= current_date.date()), «Указанная дата не может быть в прошлом» AssertionError: указанная дата не может быть в прошлом Процесс завершен с кодом выхода 1
Перехват исключений Python с помощью Try-Except
Теперь, когда вы понимаете, как создавать исключения в Python вручную, пришло время посмотреть, как обрабатывать эти исключения. В большинстве современных языков программирования для обработки исключений используется конструкция под названием «try-catch». В Python его основная форма — «попробуй-за исключением». Блок try-except выглядит так:
Пример исключения Python Try Catch
... пытаться: кроме: ...
Здесь поток программы входит в блок «попробовать». Если есть исключение, управление переходит к коду в блоке «кроме». Код обработки ошибок, который вы помещаете в блок «исключение», зависит от типа ошибки, с которой, по вашему мнению, может столкнуться код в блоке «попробовать».
Вот пример «try-except» Python (часто ошибочно упоминается как «try-catch-exception»). Допустим, мы хотим, чтобы наш код запускался, только если версия Python равна 3. Использование простого утверждения в коде выглядит так:
система импорта assert (sys.version_info[0] == 3), «Версия Python должна быть 3»
Если версия Python не 3, сообщение об ошибке выглядит следующим образом:
Трассировка (последний вызов последний): Файл "test.py", строка 2, в assert (sys.version_info[0] == 3), «Версия Python должна быть 3» AssertionError: версия Python должна быть 3 Процесс завершен с кодом выхода 1
Вместо того, чтобы позволить программе выйти из строя с необработанным исключением и показать уродливое сообщение об ошибке, мы могли бы использовать блок try-except для изящного выхода.
система импорта пытаться: assert (sys.version_info[0] == 3), «Версия Python должна быть 3» кроме Исключения как e: печать (е) rollbar.report_exc_info()
Теперь сообщение об ошибке стало намного чище:
Версия Python должна быть 3
Ключевое слово «кроме» в конструкции также принимает тип ошибки, которую вы хотите обработать. Чтобы проиллюстрировать это, давайте вернемся к нашему сценарию даты из последнего раздела. В этом скрипте мы предполагали, что пользователь введет дату в формате «ГГГГ-ММ-ДД». Однако, как разработчик, вы должны учитывать любой тип ошибочных данных, а не зависеть от пользователя. Например, некоторые сценарии исключений могут быть:
- Дата не введена (пусто)
- Введенный текст
- Введенный номер
- Время введено
- Введены специальные символы
- Введен другой формат даты (например, «дд/мм/гггг»)
Чтобы устранить все эти условия, мы можем переписать блок кода, как показано ниже. Это перехватит любое исключение ValueError, возникающее при выполнении любого из вышеуказанных условий:
.из даты и времени импорта даты и времени текущая_дата = дата/время.сейчас() print("Текущая дата: " + current_date.strftime('%Y-%m-%d')) dateinput = input("Введите дату в формате гггг-мм-дд: ") пытаться: date_provided = datetime.strptime (ввод даты, '% Y-% m-% d') кроме ValueError как e: печать (е) rollbar.report_exc_info() выход() print("Указанная дата: " + date_provided.strftime('%Y-%m-%d')) assert(date_provided.date() >= current_date.date()), «Указанная дата не может быть в прошлом»
В этом случае программа завершится корректно, если дата отформатирована неправильно.
Вы можете включить несколько блоков «исключения» в блок «попробовать», чтобы перехватывать различные типы исключений. Каждый блок «кроме» будет относиться к определенному типу ошибки:
.... пытаться: кроме : кроме : кроме : ...
Вот очень простой пример:
число0 = 10 пытаться: num1 = input("Введите 1-е число:") num2 = input("Введите второе число:") результат = (int(num1) * int(num2))/(num0 * int(num2)) кроме ValueError как ve: печать (ve) rollbar. report_exc_info() выход() кроме ZeroDivisionError как zde: печать (зде) rollbar.report_exc_info() выход() кроме TypeError как te: печатать (те) rollbar.report_exc_info() выход() кроме: print('Непредвиденная ошибка!') rollbar.report_exc_info() выход() печать(результат)
Мы можем протестировать эту программу с другими значениями:
Введите 1-е число: 1 Введите второе число: 0 деление на ноль Введите 1-й номер: Введите второе число: 6 недопустимый литерал для int() с основанием 10: '' Введите 1-й номер: 12,99 Введите 2-й номер: 33 недопустимый литерал для int() с основанием 10: «12,99»
Перехват исключений Python с помощью Try-Except-Else
Следующий элемент в конструкции «try-except» Python — «else»:
Попробуйте Python, кроме другого Пример
... пытаться: кроме : кроме : кроме : ... еще: ...
Блок else выполняется, если нет исключений, вызванных блоком try. Глядя на структуру кода выше, вы можете видеть, что «else» в обработке исключений Python работает почти так же, как конструкция «if-else»
.Чтобы показать, как работает else, мы можем немного изменить код арифметического скрипта из последнего раздела. Если вы посмотрите на скрипт, то увидите, что мы вычислили значение переменной «результат» с помощью арифметического выражения. Вместо того, чтобы помещать это в блок «попробовать», вы можете переместить его в блок «еще». Таким образом, исключение блокирует любую ошибку, возникающую при преобразовании входных значений в целые числа. И если исключений нет, блок «else» выполнит фактический расчет:
число0 = 10 пытаться: num1 = int(input("Введите 1-е число:")) num2 = int(input("Введите 2-е число:")) кроме ValueError как ve: печать (ve) rollbar.report_exc_info() выход() кроме ZeroDivisionError как zde: печать (зде) rollbar.report_exc_info() выход() кроме TypeError как te: печатать (те) rollbar. report_exc_info() выход() кроме: print('Непредвиденная ошибка!') rollbar.report_exc_info() выход() еще: результат = (число1 * число2)/(число0 * число2) печать (результат)
Использование простых целых чисел в качестве входных значений запускает код блока «else»:
Введите 1-е число: 2 Введите второе число:3 0,2
И использование ошибочных данных, таких как пустые значения, десятичные числа или строки, приводит к запуску соответствующего блока «кроме» и пропуску блока «еще»:
Введите 1-й номер:s недопустимый литерал для int() с основанием 10: 's' Введите 1-е число: 20 Введите 2-й номер: недопустимый литерал для int() с основанием 10: '' Введите 1-й номер: 5 Введите 2-й номер: 6.4 недопустимый литерал для int() с основанием 10: '6.4'
Однако все еще существует вероятность необработанных исключений при выполнении блока else:
Введите 1-е число: 1 Введите второе число: 0 Traceback (последний последний вызов): Файл "test. py", строка 19, в результат = (число1 * число2)/(число0 * число2) ZeroDivisionError: деление на ноль
Как видите, оба входа являются целыми числами (1 и 0), и блок «try» успешно преобразует их в целые числа. Когда запускается блок else, мы видим исключение.
Итак, как вы обрабатываете ошибки в блоке «else»? Вы правильно догадались — вы можете использовать еще один блок «try-except-else» внутри внешнего блока «else»:
Введите 1-е число: 1 Введите второе число: 0 деление на ноль
Перехват исключений Python с помощью Try-Except-Else-Finally
Наконец, у нас есть последний необязательный блок в обработке ошибок Python. И буквально называется «наконец-то»:
.Python Попробуйте наконец Пример
... пытаться: кроме : кроме : кроме исключения типа 3 -->>: ... еще: в конце концов:
Блок «finally» выполняется независимо от того, вызывает ли код блока «try» исключение. Если есть исключение, будет запущен код в соответствующем блоке «кроме», а затем код в блоке «наконец». Если исключений нет, будет выполняться код в блоке «иначе» (если есть блок «еще»), а затем код в блоке «наконец».
Поскольку код в блоке «finally» выполняется всегда, вы хотите сохранить здесь коды «очистки», например:
- Запись сообщений о состоянии в файлы журнала
- Сброс счетчиков, списков, массивов
- Закрытие открытых файлов
- Закрытие соединений с базой данных
- Сброс переменных объекта
- Отключение от сетевых ресурсов
- … И так далее
Вот пример использования «наконец-то»:
попробуйте: f = открыть ("testfile.txt", 'r') кроме FileNotFoundError как fne: rollbar.report_exc_info() печать (фне) print('Создание файла...') f = открыть ("testfile.txt", 'w') е.написать('2') еще: данные = f.readline (1) печать (данные) в конце концов: print('Закрытие файла') е.закрыть()
Здесь блок try пытается открыть файл для чтения. Если файл не существует, блок исключения показывает предупреждающее сообщение, создает файл и добавляет к нему статическое значение «2». Если файл существует, блок «else» считывает первую строку его содержимого и распечатывает ее. Наконец, блок «finally» закрывает файл. Это происходит независимо от того, существовал ли файл изначально.
Все, что мы обсуждали до сих пор, можно резюмировать в блок-схеме ниже:
 
Как Rollbar может помочь регистрировать и отслеживать ошибки Python
Rollbar — это платформа непрерывного улучшения кода для групп разработчиков программного обеспечения. Он предлагает автоматизированный способ захвата ошибок Python и неудачных тестов в режиме реального времени со всех уровней стека приложений и во всех средах. Это позволяет создать упреждающую и автоматизированную реакцию на ошибки приложения. На диаграмме ниже показано, как работает Rollbar:
Rollbar изначально работает с широким спектром языков программирования и сред, включая Python. Разработчики Python могут установить pyrollbar, SDK Rollbar для Python, используя такой инструмент, как pip, импортируя класс Rollbar в код и отправляя исключения Python в Rollbar.