Raise python 3: Python 3 — raise statement
raise в Python
Возбуждает указанное исключение.
Инструкция позволяет прервать штатный поток исполнения при помощи возбуждения исключения.
Если после инструкции отсутствует выражение (например, не указывается тип исключения), то повторно поднимается отловленное исключение. Если в данной области нет активного исключения (например, raise
не находится внутри блока except
), возбуждается RuntimeError (до -py3.0 возбуждалось TypeError).
try:
# Допустим в функции поднимается FileNotFoundError.
do()except OSError:
# Инструкция raise без выражения поднимет FileNotFoundError повторно.
raise
Если выражение присутствует, то результатом его вычисления должен являться либо экземпляр наследника BaseException, либо сам наследник, то есть тип. Во втором случае объект исключения будет сформирован путём инстанциирования типа без аргументов.
# Объект сформируется из класса автоматически.
raise MyException# Формируем объект исключения вручную.
raise MyException('Моё исключение')
Объект трассировки
Объект трассировки обычно создаётся автоматически при возбуждении исключения и подвязывается к нему в атрибут __traceback__
(поддерживает запись). Вы можете в один приём создать исключение и подвязать к нему трассировку при помощи метода исключения with_traceback()
— метод вернёт тот же объект исключения для которого вызван:
raise Exception('Возбуждено исключение').with_traceback(traceback_obj)
Цепочки исключений
Для формирования цепочек исключений используется дополнение from
, после которого требуется указать ещё одно исключение (класс, либо объект). Это исключение будет подвязано к возбуждаемому в атрибут __cause__
(поддерживает запись). В результате, если возбуждаемое исключение не обработано, но на вывод будут отправлены оба исключения:
try:
print(1 / 0)except Exception as exc:
# Наше второе исключение никто не поймает
# поэтому будет выведена цепочка
# из двух исключений.
raise RuntimeError('Явная цепочка исключений') from exc
Похожий механизм срабатывает автоматически, если исключение возбуждается внутри обработчика, либо блока finally
— предыдущее исключение подвязывается в атрибут __context__
нового:
try:
print(1 / 0)except:
raise RuntimeError('Неявная цепочка исключений')
+py3.3 Автоматическое формирование цепочки можно подавить, указав None
после from
. В ходе данной операции задействуется атрибут __suppress_context__
.
Python 2
Если после инструкции присутствуют от одного до трёх выражений, то они вычисляются, чтобы получить три объекта.
При помощи первых двух из этих объектов определяется тип и значение исключения.
Если первый объект явится экземпляром. То типом исключения будет являться тип этого экземпляра, а в роли значения будет выступит сам экземпляр. Второй объект при этом должен являться None
.
Если первый объект явится классом. То он и станет типом исключения. При этом для определения значения исключения будет использован второй объект.
Второй объект.
1. Если он явится экземпляром, то этот экземпляр и станет значением исключения.
2. Если второй объект явится кортежем, то он будет использован в качестве списка аргументов для инициализатора класса.
3. Если объект явится None
, то в инициализатор будет передан пустой список аргументов.
Экземпляр, созданный в ходе вызова инициализатора будет являться значением исключения.
Если присутствует третий объект
То он должен являться объектом трассировки. Данный объект в делает местом, где произошло исключение, текущее место в коде.
Если объект не является ни объектом трассировки, ни None
, возбуждается исключение TypeError.
Использование трёх выражений служит для более прозрачного повторного возбуждения исключения. В сочетании с sys. exc_info()
это в некоторой степени похоже на то, что делает from
в Python 3:
try:
do()except:
exc_info = sys.exc_info()
raise exc_info[0], exc_info[1], exc_info[2]
Как использовать ключевое слово «raise» в Python
Я читал официальное определение «raise», но до сих пор не совсем понимаю, что оно делает.
Проще говоря, что такое «raise»?
Пример использования поможет.
python
keyword
raise
Поделиться
Источник
Capurnicus
19 декабря 2012 в 17:27
6 ответов
327
Он имеет 2 цели.
йентуп дал первый.
Он используется для поднятия ваших собственных ошибок.
if something: raise Exception('My error!')
Во-вторых, необходимо повторно вызвать текущее исключение в обработчике исключений, чтобы оно могло быть обработано дальше вверх по стеку вызовов.
try:
generate_exception()
except SomeException as e:
if not can_handle(e):
raise
handle_exception(e)
Поделиться
Ignacio Vazquez-Abrams
19 декабря 2012 в 17:32
43
Он используется для поднятия ошибок.
if something:
raise Exception('My error!')
Некоторые примеры здесь
Поделиться
jackcogdill
19 декабря 2012 в 17:28
38
raise
без каких-либо аргументов-это специальное использование синтаксиса python. Это означает получить исключение и повторно поднять его. Если бы это было использование, его можно было бы назвать reraise
.
raise
Из Справочника По Языку Python :
Если никаких выражений нет, raise повторно вызывает последнее исключение,которое
было активно в текущей области.
Если raise
используется отдельно без каких-либо аргументов, то он строго используется для повторного использования. Если это сделано в ситуации, которая не находится при повторном вызове другого исключения, то отображается следующая ошибка:
RuntimeError: No active exception to reraise
Поделиться
Sohail Si
14 января 2015 в 16:21
- Как можно использовать ключевое слово ‘as’ в gremlin python?
При попытке перевести запрос, который я написал и протестировал в Gremlin CLI в gremlin-python, я сталкиваюсь с ошибками unexpected token ‘as’ в моих выражениях .as(‘foo’) . Как можно использовать ключевое слово Gremlin as при использовании gremlin-python?
- Как передать ключевое слово в функцию python lambda?
Можем ли мы использовать ключевое слово pass внутри функции python lambda или я могу использовать только условие If без другого в функции python lambda? Я пытался: f=lambda x: True if x % 2 == 0 else pass и f=lambda x: True if x % 2 == 0
15
Кроме того, raise Exception("message")
и raise
Python 3 ввели новую форму, raise Exception("message") from e
. Это называется цепочкой исключений, она позволяет сохранить исходное исключение (первопричину) с его обратной трассировкой.
Это очень похоже на внутренние исключения из C#.
Дополнительная информация:
https:/ / www.python.org/dev/peps/pep-3134/
Поделиться
Stan Prokop
04 мая 2017 в 08:11
13
Вы можете использовать его для создания ошибок в рамках проверки ошибок:
if (a < b):
raise ValueError()
Или обрабатывать некоторые ошибки, а затем передавать их как часть обработки ошибок:
try:
f = open('file.txt', 'r')
except IOError:
# do some processing here
# and then pass the error on
raise
Поделиться
sampson-chen
19 декабря 2012 в 17:32
11
raise
вызывает возникновение исключения. В некоторых других языках вместо этого используется глагол ‘throw’.
Он предназначен для того, чтобы сигнализировать о ситуации ошибки; он сигнализирует, что ситуация исключительна для нормального потока.
Возникшие исключения могут быть снова перехвачены кодом ‘upstream’ (окружающий блок или функция ранее в стеке) для обработки его, используя комбинацию try
, except
.
Поделиться
Martijn Pieters
19 декабря 2012 в 17:30
Похожие вопросы:
Как использовать ключевое слово “separate»
Я не могу понять ключевое слово separate в Ada и его концепцию глубины. Пожалуйста, помогите мне понять, приведя небольшой пример? Допустим, у меня есть вложенная процедура with ada.text_io; use…
Robotframework + Selenium2Library Native Py Ключевое Слово Run_on_failure
У меня возникли некоторые проблемы с получением selenium2library для запуска запуска при сбое при использовании пользовательского ключевого слова robotframework. Я написал ключевое слово в python,…
Используйте ключевое слово Python `set` в Jinja
Я хочу вернуть уникальные предметы в шаблон Jinja. Упрощенный: {% set lst = [1, 2, 3, 3, 2] %} {% for t in set(lst) %} {{ t }} {% endfor %} Но это приводит к ошибке: UndefinedError: ‘set’ is…
Как использовать ключевое слово python continue в качестве строкового литерала в скрипте python?
Я пишу сценарий python, в котором мне нужно использовать слово continue . Я знаю, что это ключевое слово python. Так как же мне написать свой скрипт, чтобы python не жаловался, что я использую…
Когда использовать ключевое слово «self» в Python
Как использовать ключевое слово self в отношении переменных? Похоже, что вы можете установить переменную класса внутри конструктора __init__ , используя префикс self???
Как можно использовать ключевое слово ‘as’ в gremlin python?
При попытке перевести запрос, который я написал и протестировал в Gremlin CLI в gremlin-python, я сталкиваюсь с ошибками unexpected token ‘as’ в моих выражениях . as(‘foo’) . Как можно использовать…
Как передать ключевое слово в функцию python lambda?
Можем ли мы использовать ключевое слово pass внутри функции python lambda или я могу использовать только условие If без другого в функции python lambda? Я пытался: f=lambda x: True if x % 2 == 0…
глобальное ключевое слово в python
Я изучаю python и получаю борьбу с глобальным ключевым словом внутри vscode . До сих пор код работает, но линтер vscode вызывает ошибку, и я хотел бы понять, почему Я попробовал использовать…
Как исправить ключевое слово raise (или return) Python для целей модульного тестирования?
Каково пространство имен для ключевых слов Python, которые может поймать mock.patch? Когда кто-то хочет открыть патч или распечатать его, можно использовать mock.patch(builtins.open) или…
В spring когда использовать новое ключевое слово и ключевое слово autowired
я новичок в spring. я запутался, когда использовать ключевое слово autowired и new keyword.while используя класс модели в spring мы используем новое ключевое слово, а не Ключевое слово Autowired
Инструкция 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
используется для цепочки исключений. Если исключение задано, второе выражение должно быть другим классом или экземпляром исключения, который затем будет присоединен к брошенному исключению в качестве атрибута __cause__
, который доступен для записи. Если возникшее исключение не обработано, то будут напечатаны оба исключения:
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
Исключения — документация Conservative Python 3 Porting Guide 1.
0
Очень ранние версии Python использовали простые строки для сигнализации об ошибках.
Позже Python позволил поднимать произвольные классы и добавил специализированные
классы исключений в стандартной библиотеке.
По причинам обратной совместимости некоторые устаревшие методы все еще оставались
разрешено в Python 2.
Это создает путаницу для изучающих язык и предотвращает некоторые
оптимизация производительности.
Python 3 удаляет устаревшие методы.Он также дополнительно консолидирует модель исключений.
Исключения теперь являются экземплярами выделенных классов и содержат все
информация об ошибке: тип, значение и трассировка.
В этой главе упоминаются все изменения, связанные с исключениями, необходимые для запуска
поддержка Python 3.
Новый
, кроме синтаксиса
- Fixer:
python-modernize -wnf lib2to3.fixes.fix_except
- Распространенность: очень часто
В Python 2 синтаксис для перехвата исключений был
за исключением ExceptionType:
или за исключением ExceptionType, цель:
, когда
объект исключения желателен. ExceptionType
может быть кортежем, например,
за исключением (TypeError, ValueError):
.
Это может привести к трудно обнаруживаемым ошибкам: команда
, кроме TypeError, ValueError:
(обратите внимание на отсутствие скобок) будет обрабатывать только
Ошибка типа
. Он также назначит объект исключения имени
ValueError
, затенение встроенного.
Чтобы исправить это, Python 2.6 представил альтернативный синтаксис:
, за исключением ExceptionType в качестве цели:
.В Python 3 старый синтаксис больше не разрешен.
Вам нужно будет перейти на новый синтаксис.
Рекомендуемый фиксатор работает достаточно надежно, а также исправляет
Проблема с итерацией исключений описана ниже.
Новый
поднять
синтаксис
- Fixer:
python-modernize -wnf libmodernize.fixes.fix_raise -f libmodernize.fixes.fix_raise_six
- Распространенность: Обычный
Оператор Python 2 raise
был разработан в то время, когда исключения не
классы и исключения тип , значение и трассировка компонентов
было три отдельных объекта:
поднять ValueError, 'недопустимый ввод' поднять ValueError, 'недопустимый ввод', some_traceback
В Python 3 один единственный объект включает всю информацию об исключении:
поднять ValueError ('недопустимый ввод') e = ValueError ('недопустимый ввод') е. __traceback__ = some_traceback поднять е
Python 2.6 допускает первый вариант. Во втором случае повторное создание исключения,
Библиотека совместимости: библиотека six включает удобную оболочку, которая работает в обоих
версии:
импорт шесть six.reraise (ValueError, 'недопустимый ввод', some_traceback)
Рекомендуемые средства исправления сделают эти преобразования автоматически и достаточно
надежно, но обязательно проверьте полученные изменения.
Поймано исключение «Область действия»
- Фиксатор: Нет
- Распространенность: Редко
Как обсуждалось ранее, в Python 3 вся информация
об исключении, включая трассировку, содержится в исключении
объект.Поскольку трассировка содержит ссылки на значения всех локальных переменных,
сохранение исключения в локальной переменной обычно образует ссылочный цикл,
сохранение всех локальных переменных до следующего этапа сборки мусора.
Чтобы предотвратить эту проблему, процитируйте документацию Python:
Когда исключение было назначено с использованием в качестве цели, оно очищается в
конец предложения except. Это как будтобыло переведено на
кроме E как N: пытаться: фу наконец-то: дель НЭто означает, что исключение должно быть присвоено другому имени, чтобы
может ссылаться на него после предложения except.
К сожалению, Automated fixer: python-modernize не предоставляет исправления для этого.
изменять.
Эта проблема приводит к громкой ошибке NameError
при запуске тестов.
Когда вы видите эту ошибку, примените рекомендованное исправление — назначьте другое имя
за исключением использования его вне , за исключением пункта
.
Итерация исключений
- Fixer:
python-modernize -wnf lib2to3.fixes.fix_except
(но см. Предостережение ниже) - Распространенность: Редко
В Python 2 исключения были итеративными , поэтому можно было «распаковать»
аргументы исключения как часть , кроме оператора
:
, кроме RuntimeError как (число, сообщение):
В Python 3 это больше не так, и аргументы должны быть доступны через
атрибут args
:
, кроме RuntimeError как e: число, сообщение = e. аргументы
Рекомендуемый фиксатор подходит для легких случаев распаковки в , кроме
.
заявления.
Если ваш код итерирует исключения в другом месте, вам необходимо вручную
измените его, чтобы вместо этого перебирать аргументов
.
Кроме того, фиксатор плохо справляется с однолинейными наборами, такими как:
, кроме RuntimeError as (число, сообщение): передать
Проверьте вывод и вручную разбейте их на несколько строк.
Вызов исключений
- Фиксатор: Нет
- Распространенность: Редко
В Python 3 объект, используемый с raise
, должен быть экземпляром
BaseException
, в то время как Python 2 также допускал классы старого стиля.Точно так же Python 3 запрещает перехват классов без исключения в , кроме
утверждение.
Создание классов без исключения было устаревшим еще в Python 2.0,
но код, который это делает, все еще можно найти.
Каждый случай необходимо обрабатывать вручную.
Если для исключения существует специальный класс,
сделать его наследником Exception
.
В противном случае переключитесь на использование специального класса Exception.
Удаленная
Стандартная ошибка
- Fixer:
python-modernize -wnf lib2to3.fixes.fix_standarderror
(но см. предостережение ниже) - Распространенность: Редко
Класс StandardError
удален в Python 3.
Это был базовый класс для встроенных исключений, и он оказался
ненужное звено в цепочке наследования почти любого исключения.
Рекомендуемый фиксатор заменит все случаи использования StandardError
на
Исключение
.
Просмотрите результат, чтобы убедиться, что он правильный.
Некоторый код может полагаться на имя класса исключения или исключения не
полученный из StandardError
или иным образом обработать StandardError
специально. Вам нужно будет обрабатывать эти кейсы вручную.
Удалено
sys.exc_type
, sys.exc_value
, sys.exc_traceback
- Фиксатор: Нет
- Распространенность: Редко
Эти связанные с исключениями атрибуты модуля sys
не являются потокобезопасными,
и устарели, начиная с Python 1.5.
Они были исключены из Python 3.
Информацию можно получить, позвонив по номеру exc_info ()
:
exc_type, exc_value, exc_traceback = sys.exc_info ()
Введение — Настоящий Python
Смотреть сейчас Это руководство содержит соответствующий видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Введение в исключения Python
Программа Python завершается, как только обнаруживает ошибку. В Python ошибка может быть синтаксической ошибкой или исключением. В этой статье вы увидите, что такое исключение и чем оно отличается от синтаксической ошибки.SyntaxError: недопустимый синтаксис
Стрелка указывает, где синтаксический анализатор обнаружил синтаксическую ошибку . В этом примере одной скобки слишком много. Удалите его и снова запустите свой код:
>>> печать (0/0)
Отслеживание (последний вызов последний):
Файл "", строка 1, в
ZeroDivisionError: целочисленное деление или по модулю нуля
На этот раз вы столкнулись с ошибкой исключения . Этот тип ошибки возникает всякий раз, когда синтаксически правильный код Python приводит к ошибке.В последней строке сообщения указано, с каким типом ошибки исключения вы столкнулись.
Вместо отображения сообщения ошибка исключения
Python детализирует, какой тип ошибки исключения был обнаружен. В данном случае это была ошибка ZeroDivisionError
. Python поставляется с различными встроенными исключениями, а также с возможностью создавать самоопределяемые исключения.
Вызов исключения
Мы можем использовать raise
, чтобы генерировать исключение в случае возникновения условия.Заявление можно дополнить настраиваемым исключением.
Если вы хотите выдать ошибку при возникновении определенного условия, используя поднять
, вы можете сделать это следующим образом:
х = 10
если x> 5:
Raise Exception ('x не должно превышать 5. Значение x было: {}'. format (x))
Когда вы запустите этот код, вы получите следующий результат:
Traceback (последний звонок последний):
Файл "", строка 4, в
Исключение: x не должно превышать 5.Значение x было: 10
Программа останавливается и отображает наше исключение на экране, предлагая подсказки о том, что пошло не так.
Ошибка
AssertionError
Исключение
Вместо того, чтобы ждать, пока программа выйдет из строя на полпути, вы также можете начать с утверждения на Python. Мы утверждаем
, что определенное условие выполнено. Если это условие оказывается равным True
, то это отлично! Программа может продолжаться. Если условие оказывается False
, программа может выдать исключение AssertionError
.
Взгляните на следующий пример, где утверждается, что код будет выполняться в системе Linux:
импортная система
assert ('linux' в sys.platform), «Этот код работает только в Linux».
Если вы запустите этот код на машине Linux, утверждение пройдет. Если бы вы запустили этот код на машине Windows, результатом утверждения было бы False
, и результат был бы следующим:
Traceback (последний звонок последний):
Файл "", строка 2, в
AssertionError: этот код работает только в Linux.
В этом примере выброс исключения AssertionError
— это последнее, что программа сделает. Программа будет остановлена и не будет продолжаться. Что, если это не то, что вам нужно?
пытаются
и кроме
Блок: обработка исключений
Блок try
и за исключением
в Python используется для перехвата и обработки исключений. Python выполняет код, следующий за оператором try
, как «нормальную» часть программы.Код, следующий за оператором except
, является ответом программы на любые исключения в предыдущем предложении try
.
Как вы видели ранее, когда синтаксически правильный код вызывает ошибку, Python выдает ошибку исключения. Эта ошибка исключения приведет к сбою программы, если она не будет обработана. Предложение за исключением
определяет, как ваша программа реагирует на исключения.
Следующая функция может помочь вам понять попробуйте
и , кроме блока
:
def linux_interaction ():
assert ('linux' в sys.платформа), «Функция может работать только в системах Linux».
print ('Делаю что-то.')
linux_interaction ()
может работать только в системе Linux. assert
в этой функции вызовет исключение AssertionError
, если вы вызовете его в операционной системе, отличной от Linux.
Вы можете дать функции попробовать
, используя следующий код:
попробуйте:
linux_interaction ()
Кроме:
проходить
Способ обработки ошибки здесь — передача прохода
.Если бы вы запустили этот код на машине с Windows, вы бы получили следующий результат:
У вас ничего нет. Здесь хорошо то, что программа не вылетела. Но было бы неплохо увидеть, возникало ли какое-либо исключение всякий раз, когда вы запускали свой код. С этой целью вы можете изменить проход
на что-то, что будет генерировать информативное сообщение, например:
попробуйте:
linux_interaction ()
Кроме:
print ('Функция Linux не была выполнена')
Выполните этот код на машине Windows:
Функция Linux не была выполнена
Когда в программе, выполняющей эту функцию, возникает исключение, программа продолжит работу, а также сообщит вам о том, что вызов функции не был успешным.
Вы не смогли увидеть тип ошибки, возникшей в результате вызова функции. Чтобы точно увидеть, что пошло не так, вам нужно будет поймать ошибку, которую выдала функция.
Следующий код представляет собой пример, в котором вы фиксируете AssertionError
и выводите это сообщение на экран:
попробуйте:
linux_interaction ()
кроме AssertionError как ошибки:
печать (ошибка)
print ('Функция linux_interaction () не была выполнена')
Запуск этой функции на машине Windows дает следующее:
Функция может работать только в системах Linux.Функция linux_interaction () не была выполнена
Первое сообщение — это AssertionError
, информирующее вас о том, что функция может быть выполнена только на машине Linux. Второе сообщение сообщает вам, какая функция не была выполнена.
В предыдущем примере вы вызвали функцию, которую написали сами. При выполнении функции вы поймали исключение AssertionError
и распечатали его на экране.
Вот еще один пример, когда вы открываете файл и используете встроенное исключение:
попробуйте:
с открытым ('файл.log ') как файл:
read_data = file.read ()
Кроме:
print ('Не удалось открыть файл.log')
Если file.log не существует, этот блок кода выведет следующее:
Это информационное сообщение, и наша программа продолжит работу. В документации Python вы можете видеть, что существует множество встроенных исключений, которые вы можете использовать здесь. Одно исключение, описанное на этой странице, следующее:
Исключение
FileNotFoundError
Возникает, когда файл или каталог запрошены, но не существуют.Соответствует ошибке ENOENT.
Чтобы перехватить этот тип исключения и вывести его на экран, вы можете использовать следующий код:
попробуйте:
с open ('file.log') как файл:
read_data = file.read ()
кроме FileNotFoundError как fnf_error:
печать (fnf_error)
В этом случае, если file. log не существует, вывод будет следующим:
[Errno 2] Нет такого файла или каталога: 'file.log'
Вы можете иметь более одного вызова функции в предложении try
и ожидать перехвата различных исключений.Здесь следует отметить, что код в предложении try
останавливается, как только возникает исключение.
Предупреждение: Перехват Исключение
скрывает все ошибки… даже совершенно неожиданные. Вот почему вам следует избегать голых , кроме предложений
в ваших программах на Python. Вместо этого вам нужно обратиться к конкретным классам исключений , которые вы хотите перехватывать и обрабатывать. Вы можете узнать больше о том, почему это хорошая идея, в этом руководстве.
Посмотрите на следующий код. Здесь вы сначала вызываете функцию linux_interaction ()
, а затем пытаетесь открыть файл:
попробуйте:
linux_interaction ()
с open ('file. log') как файл:
read_data = file.read ()
кроме FileNotFoundError как fnf_error:
печать (fnf_error)
кроме AssertionError как ошибки:
печать (ошибка)
print ('Функция Linux linux_interaction () не была выполнена')
Если файл не существует, запуск этого кода на машине Windows выдаст следующее:
Функция может работать только в системах Linux.Функция Linux linux_interaction () не была выполнена
Внутри предложения try
вы сразу же столкнулись с исключительной ситуацией и не дошли до той части, где пытаетесь открыть file.log . Теперь посмотрим, что происходит, когда вы запускаете код на машине Linux:
[Errno 2] Нет такого файла или каталога: 'file.log'
Вот основные выводы:
- Предложение
try
выполняется до момента, когда встречается первое исключение. - Внутри
, за исключением предложения
или обработчика исключений, вы определяете, как программа реагирует на исключение. - Вы можете предвидеть множественные исключения и различать, как программа должна на них реагировать.
- Избегайте использования
, кроме пунктов
.
иначе
Пункт
В Python с помощью оператора else
можно указать программе выполнить определенный блок кода только при отсутствии исключений.
Посмотрите на следующий пример:
попробуйте:
linux_interaction ()
кроме AssertionError как ошибки:
печать (ошибка)
еще:
print ('Выполнение предложения else.')
Если бы вы запустили этот код в системе Linux, результат был бы следующим:
Что-то делать.
Выполнение предложения else.
Поскольку программа не вызвала никаких исключений, было выполнено предложение else
.
Вы также можете попробовать
, чтобы запустить код внутри предложения else
и также перехватить возможные исключения:
попробуйте:
linux_interaction ()
кроме AssertionError как ошибки:
печать (ошибка)
еще:
пытаться:
с открытым ('файл. log ') как файл:
read_data = file.read ()
кроме FileNotFoundError как fnf_error:
печать (fnf_error)
Если бы вы выполнили этот код на машине Linux, вы бы получили следующий результат:
Что-то делать.
[Errno 2] Нет такого файла или каталога: 'file.log'
Из выходных данных видно, что функция linux_interaction ()
была запущена. Поскольку никаких исключений не обнаружено, была предпринята попытка открыть файл file.log .Этот файл не существует, и вместо его открытия вы поймали исключение FileNotFoundError
.
Очистка после использования
, наконец,
Представьте, что вам всегда приходилось выполнять какое-то действие для очистки после выполнения вашего кода. Python позволяет сделать это с помощью предложения finally
.
Взгляните на следующий пример:
попробуйте:
linux_interaction ()
кроме AssertionError как ошибки:
печать (ошибка)
еще:
пытаться:
с открытым ('файл. log ') как файл:
read_data = file.read ()
кроме FileNotFoundError как fnf_error:
печать (fnf_error)
наконец-то:
print ('Очистка, независимо от каких-либо исключений.')
В предыдущем коде будет выполнено все, что указано в предложении finally
. Не имеет значения, встретите ли вы исключение где-то в предложениях try
или else
. Выполнение предыдущего кода на машине Windows выдаст следующее:
Функция может работать только в системах Linux.Уборка, независимо от каких-либо исключений.
Подведение итогов
Увидев разницу между синтаксическими ошибками и исключениями, вы узнали о различных способах создания, перехвата и обработки исключений в Python. В этой статье вы видели следующие варианты:
-
Raise
позволяет в любой момент вызвать исключение. -
assert
позволяет проверить, выполняется ли определенное условие, и выдать исключение, если это не так. - В предложении
try
все операторы выполняются до тех пор, пока не будет обнаружено исключение. -
, за исключением
, используется для перехвата и обработки исключений, обнаруженных в предложении try. -
else
позволяет кодировать разделы, которые должны выполняться только в том случае, если в предложении try не встречаются исключения. -
finally
позволяет вам выполнять разделы кода, которые должны выполняться всегда, с или без каких-либо ранее встреченных исключений.
Надеюсь, эта статья помогла вам понять основные инструменты, которые Python может предложить при работе с исключениями.
Смотреть сейчас Это руководство содержит соответствующий видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Введение в исключения Python
поднять · PyPI
Вызов исключений с помощью функции вместо оператора.
Обеспечивает минималистичный, чистый и портативный интерфейс для поднятия
исключения со всеми преимуществами функций перед синтаксисом.
Установка
pip install поднять
Если вам нужно получить его вручную или вам нужен «без отслеживания»
вариант, советы см. в разделе «Установка вручную».
Использование
Увеличение импорта_:
от повышения_ импорта_ повышения_
Вызов исключения:
Raise_ (Исключение ('foo'))
Вызвать исключение с трассировкой:
raise_ (Исключение ('foo'), трассировка)
Повышение лямбды:
lambda x: x if x> 0 else raise_ (ValueError ('x слишком мал!'))
И, конечно же, поскольку raise_ — это функция,
вы можете комбинировать его с functools.partial
и другие библиотеки функционального программирования и
техники для многих других целей.
Сюрпризы
В Python 3 оператор Raise повторно использует
__traceback__ каждый раз, когда он вызывает
исключение, если вы явно не установили другую трассировку.
Функция Raise_ повторно использует , а не
__traceback__, и вместо этого очищает его, если вы это сделаете
не переходите в трассировку, как если бы вы перешли в None.
Если вы хотите, чтобы поведение Python 3 было повторным использованием
__traceback__, вы должны явно передать его:
Raise_ (исключение, исключение.__проследить__)
Или, если хотите изящно деградировать на
Реализации Python, в которых нет
__traceback__ по их исключениям:
Raise_ (исключение, getattr (исключение, '__traceback__', Нет))
Мобильность
Переносится на все выпуски Python 3 и Python 2.
(Самый старый из протестированных — 2.5, но он, скорее всего, будет работать на всех
Версии Python 2 и, возможно, даже более ранние версии.)
Для реализаций Python, не поддерживающих повышение
с настраиваемой трассировкой вариант «без трассировки» может быть
устанавливается вручную.
Ручная установка
В зависимости от ваших потребностей, либо:
- Возьмите один из этих файлов и сохраните его как raise_. py:
- raise_3.py для Python 3.
- raise_2.py — для Python 2.
- raise_no_traceback.py предназначен для реализаций Python, которые
не поддерживают создание исключений с помощью настраиваемой трассировки.
- Возьмите указанные выше файлы, которые вам нужны, и сохраните их в папке
называется Raise_ вместе с настраиваемым __init__.ру, что
условно импортирует из нужного файла по мере необходимости.
Так всегда можно сделать из raise_ import raise_
во всем остальном коде, и он будет работать.
Как обрабатывать и вызывать исключения в Python — 12 вещей, которые нужно знать | by Yong Cui
1. Базовая форма обработки исключений
Стандартный способ обработки исключений — использовать блок try… except
. Это очень похоже на try… catch
block во многих других языках программирования, если у вас есть такой опыт.
Предложение try
включает код, который потенциально вызывает исключение. Если все работает хорошо в предложении try
, никакой код в , кроме предложения
, выполняться не будет. Блок try… except
завершен, и программа продолжится.
Однако, если исключение возникает в предложении try
, Python перестанет выполнять какой-либо дополнительный код в этом предложении и передаст исключение в предложение за исключением
, чтобы увидеть, обрабатывается ли там эта конкретная ошибка.
Давайте рассмотрим тривиальный пример самой простой формы обработки исключений:
Базовая форма обработки исключений
Как вы можете видеть, когда деление работает должным образом, результат этого деления (т.е. 2.0) печатается. . Однако, когда мы пытаемся разделить число на ноль, Python вызывает ZeroDivisionError
. К счастью, наша функция была написана для обработки этой ошибки и сообщения «Нельзя делить 12 на ноль». печатается, чтобы проинформировать пользователя об этой ошибке.
2.
Зачем обрабатывать исключения?
Теперь мы понимаем, как обрабатывать исключения с помощью блока try… except
. Но зачем нам обрабатывать исключения? Наиболее важным преимуществом является информирование пользователя об ошибке, позволяющее программе продолжить работу. Давайте посмотрим на некоторые похожие функции, с обработкой исключений и без нее:
Обработанное исключение против необработанного
Как показано выше, когда мы вызываем функцию, обрабатывающую исключение, мы видим, что программа выполняется до конца функции (Строки 15 –17).Напротив, когда мы вызываем функцию, которая не обрабатывает исключение, мы видим, что программа не может завершиться до конца функции (строки 18–22).
3. Присвоение переменной
Мы можем назначить исключение переменной, чтобы получить дополнительную информацию об исключении. В приведенном ниже коде мы можем назначить обработанное исключение TypeError
переменной e
, чтобы мы могли попросить Python напечатать для нас сообщение об ошибке. Как показано в строке 10, печатается сообщение об ошибке, в котором говорится, что мы не можем объединить строки с целыми числами:
Назначение переменной исключения
4.Множественные исключения
Мы можем обрабатывать несколько исключений в , кроме пункта
. Мы просто заключим возможные исключения в кортеж, как показано в строке 6 следующего фрагмента кода. Когда мы вызываем функцию, мы намеренно делаем две разные ошибки, вызывая ValueError
и ZeroDivisionError
соответственно. Сообщения четко сообщают нам, какие исключения обрабатываются.
Множественные исключения
5. Множественные пункты except
В связи с предыдущим разделом, когда мы ожидаем разные исключения, у нас может быть несколько пунктов , кроме предложений
, каждое из которых обрабатывает некоторые особые исключения.Давайте изменим указанную выше функцию (т. Е. div_six
), чтобы создать несколько предложений , кроме предложений , как показано ниже.
Несколько предложений за исключением
После модификации, когда мы вызываем функцию дважды с намерением вызвать по два отдельных исключения каждое, ожидаемые сообщения печатаются для каждого , за исключением предложения
.
6. Предложение else
Мы можем использовать предложение else
в блоке try… кроме блока
. Следует отметить, что предложение else
должно появиться после предложения , за исключением предложения
.Код в предложении else
запускается, когда предложение try
завершается без возникновения каких-либо исключений. Давайте посмотрим, как это работает:
Обработка исключений с предложением Else
В коде есть функция, которая использует предложение else
в try… кроме блока
. Как видите, код в предложении else
запускается только после завершения предложения try
и не возникает никаких исключений. С другой стороны, код не запускается при возникновении и обработке исключения.
7. Предложение finally
Помимо использования предложения else
, мы также можем использовать предложение finally
в блоке try… except
. Обратите внимание, что предложение finally
должно быть помещено в конец блока, ниже , за исключением предложения
или else
(если установлено). Код в предложении finally
будет выполняться прямо перед тем, как будет выполнен весь блок try… за исключением завершения блока
(после выполнения кода в предложении try
или , кроме предложения
).Важно отметить, что код в предложении finally
будет выполняться независимо от состояния создания и обработки исключения. Давайте посмотрим, как это работает:
Обработка исключений с помощью предложения finally
Как показано в приведенном выше фрагменте кода, у нас есть функция с предложением finally
. Мы вызываем функцию дважды, второй вызов вызывает исключение. В обоих случаях код в предложении finally
выполняется успешно.
Еще одна важная вещь, которую следует отметить при использовании предложения finally
, заключается в том, что если предложение try включает в себя оператор break
, continue
и return
, предложение finally
будет выполняться первым перед выполнением break
, continue
или return
statement.Здесь многие могут ошибаться. Давайте посмотрим на тривиальный пример ниже:
Порядок выполнения (наконец)
Обработка исключений Python
В этом руководстве будет представлено введение в исключения Python, наиболее распространенные типы исключений и способы обработки возникших исключений с помощью try
и , за исключением предложений
.
Что такое исключение Python?
Исключение Python — это конструкция, используемая для сигнализации о важном событии, обычно об ошибке, которое происходит при выполнении программы. Исключение может привести к остановке программы, если она не будет должным образом «поймана» (т.е. обработана правильно). Если вы думаете, что ваша программа может вызвать исключение при выполнении, вам будет полезно использовать try / except
для их обработки, что мы увидим в следующем разделе.
Обработка исключений
В приведенном ниже примере мы предлагаем пользователю ввести число, и после выполнения программа выдает значение данного числа в квадрате. Программа будет работать, пока вы вводите число.
пока True:
x = int (raw_input ("Пожалуйста, введите число:"))
print ("% s в квадрате равно% s"% (x, x ** 2))
Когда вы вводите строку или любой другой символ, не являющийся числом, например «один», программа вызывает исключение «Ошибка значения», как показано ниже:
$ python в квадрате.py
Пожалуйста, введите число: 3
3 в квадрате равно 9
Пожалуйста, введите число: 4
4 в квадрате равно 16
Пожалуйста, введите число: пять
Отслеживание (последний вызов последний):
Файл "squared. py", строка 4, в
x = int (raw_input ("Пожалуйста, введите число:"))
ValueError: недопустимый литерал для int () с базой 10: 'пять'
Вот здесь и появляется обработка исключений.Вам нужно знать, как правильно обрабатывать исключения, особенно в производственных средах, потому что, если они не обрабатываются, ваша программа не будет знать, что делать, и выйдет из строя.
Давайте посмотрим, как мы можем справиться с вышеуказанной ошибкой. Это делается путем окружения программы, которая, по вашему мнению, может вызвать исключение, ключевым словом try
и сопоставления его со следующим ключевым словом except
для выполнения в случае возникновения исключения.
Давайте перепишем ту же программу и на этот раз позаботимся обо всех возможных исключениях.
пока True:
пытаться:
x = int (raw_input ("Пожалуйста, введите число:"))
print ("% s в квадрате равно% s"% (x, x ** 2))
кроме ValueError:
print («Пожалуйста, введите правильный номер!»)
Как видно из приведенной выше программы, сначала выполняется код внутри оператора try
. Если ошибки не возникает, выполняется остальная часть кода, а оператор , кроме
, пропускается.
В случае возникновения исключения (например, при вводе строки вместо числа) программа выполняет оператор except
, который соответствует его оператору try
, за которым следует остальная часть кода за пределами try / except Блок
, если есть.
Посмотрите, что происходит, когда мы запускаем наш код с операторами try / except
:
$ python safe_squared.py
Пожалуйста, введите число: 3
3 в квадрате равно 9
Пожалуйста, введите число: 4
4 в квадрате равно 16
Пожалуйста, введите число: пять
Пожалуйста введите правильное число!
Пожалуйста, введите число: 5
5 в квадрате равно 25
Примечание : имейте в виду, что предложение except
будет обрабатывать исключения только из соответствующего предложения try
, даже если существует несколько обработчиков предложения try / except
.
Типы исключений в Python
Python имеет несколько встроенных исключений. Давайте взглянем на некоторые из наиболее распространенных исключений, чтобы вы могли понять, что это такое и как их использовать.
Исключение KeyError
Это ошибка, возникающая при использовании словаря при попытке получить ключ, которого нет в словаре.
Ниже приведено представление Django, используемое для аутентификации пользователей, и оно ожидает получить словарь, содержащий ключи «имя пользователя» и «пароль».Если какой-либо из ключей не передан в данных, программа вызовет исключение Key Error.
def Authenticate_user (запрос):
пытаться:
email = request.data ['имя пользователя']
пароль = request.data ['пароль']
пользователь = аутентификация (электронная почта = электронная почта, пароль = пароль)
если user и user.is_active:
возврат ответа (user_details, status = HTTP_200_OK)
еще:
res = {'error': 'не удается пройти аутентификацию с указанными учетными данными'}
return Response (res, status = status. HTTP_400_BAD_REQUEST)
кроме KeyError:
res = {'error': 'укажите имя пользователя и пароль'}
Используя try / except
для перехвата исключения, наш пользователь увидит ошибку вместо сбоя нашего сервера.
Исключение IndentationError
Исключение такого типа возникает, когда ваш код имеет неправильный отступ. Вместо использования фигурных скобок для указания области действия Python использует отступы, поэтому важно получить правильный отступ, что и является целью этого исключения.
Напишем функцию, проверяющую четность числа:
def is_even (число):
если число% 2 == 0:
print ("% s - четное число"% (число))
еще:
print ("% s - нечетное число"% (число))
печать (is_even (1))
печать (is_even (2))
Функция приведет к ошибке отступа в обеих строках 2 и 4, поскольку ожидает, что код будет иметь отступ с 8 пробелами, а не с 4.
Если вы запустите программу, она выдаст следующий результат:
$ python is_even. IndentationError: ожидается блок с отступом
Исключение SyntaxError
Это один из наиболее распространенных типов исключений в Python. Это происходит, когда есть ошибка в синтаксисе вашего кода.
Давайте посмотрим на пример ниже:
def is_odd (n):
если n% 2! = 0:
печать (это странно)
еще:
print ("не лишний")
печать (is_odd (7))
Результатом этого кода будет недопустимый синтаксис в строке 3, поскольку строка «это нечетно» не заключена в кавычки.SyntaxError: EOL при сканировании строкового литерала
Имейте в виду, что существует много различных типов синтаксических ошибок, и это только один пример.
Исключение TypeError
Это исключение возникает при попытке выполнения операции или функции, недопустимой для указанного типа данных. В приведенном ниже примере функция sum_of_numbers
принимает 2 аргумента и складывает их. Когда вы пытаетесь вызвать функцию с 3 аргументами, она вызывает исключение TypeError, поскольку ожидает только 2 аргумента.
def sum_of_numbers (a, b):
вернуть a + b
печать (сумма_числов (1, 2, 7))
Выполнение этого кода дает следующий результат:
$ python sum_of_numbers.py
Отслеживание (последний вызов последний):
Файл "sum_of_numbers.py", строка 4, в
печать (сумма_числов (1, 2, 7))
TypeError: sum_of_numbers () принимает ровно 2 аргумента (3 задано)
Попытка / исключение, еще и наконец Пункты
Есть несколько других компонентов обработки исключений, и это предложения else
и , наконец,
.
Мы уже могли использовать операторы try и catch, которые используются для обнаружения ошибок. Давайте теперь посмотрим на , еще на
и , наконец, на операторы
.
Пункт else
Предложение else используется для выполнения кода, когда программа , а не вызывает исключение. Также лучше использовать предложение else, чем добавлять дополнительный код в предложение try
. Это связано с тем, что он позволяет избежать непреднамеренного перехвата исключения, которое не было вызвано кодом, защищенным операторами try / except
.
Рассмотрим пример, который мы использовали в начале этого руководства, но вместо этого мы собираемся выполнить оператор print
внутри оператора else
.
пока True:
пытаться:
x = int (raw_input ("Пожалуйста, введите число:"))
кроме ValueError:
print («Пожалуйста, введите правильный номер!»)
еще:
print ("% s в квадрате равно% s"% (x, x ** 2))
Выполнение этого кода обеспечивает те же функции, что и раньше, за исключением того, что он изолирует подверженный ошибкам int (raw_input (...)) Код
в операторе try
и «безопасный» код в операторе else
.
$ python else_squared.py
Пожалуйста, введите число: 3
3 в квадрате равно 9
Пожалуйста, введите число: 4
4 в квадрате равно 16
Пожалуйста, введите число: пять
Пожалуйста введите правильное число!
Пожалуйста, введите число: 5
5 в квадрате равно 25
Окончательная статья
Этот пункт предназначен для определения действий по очистке, которые должны выполняться независимо от того, было ли возбуждено исключение или нет.
Предложение finally
всегда должно выполняться перед выходом из оператора try / except
, независимо от того, произошло ли исключение. Обычно это используется для очистки, например, для закрытия открытого файла.
Давайте включим в наш пример , наконец, предложение
:
количество = 0
в то время как True:
пытаться:
x = int (raw_input ("Пожалуйста, введите число:"))
кроме ValueError:
print («Пожалуйста, введите правильный номер!»)
еще:
print ("% s в квадрате равно% s"% (x, x ** 2))
наконец-то:
print ("Выполнено% s раз"% count)
Выполнение этого кода аналогично предыдущему, за исключением того, что теперь мы можем видеть, сколько раз выполнялся наш цикл, независимо от того, возникло ли исключение или нет:
$ python finally_squared.ру
Пожалуйста, введите число: 3
3 в квадрате равно 9
Пробежала 1 раз
Пожалуйста, введите число: 4
4 в квадрате равно 16
Пробежала 2 раза
Пожалуйста, введите число: пять
Пожалуйста введите правильное число!
Пробежала 3 раза
Пожалуйста, введите число: 5
5 в квадрате равно 25
Пробежала 4 раза
Заключение
В этом руководстве мы кратко объяснили, как обрабатывать исключения в Python с помощью операторов try / except
, включая некоторые из дополнительных компонентов, else
и , наконец,
. Я надеюсь, что это руководство устранило вашу путаницу с исключениями Python.
Если вы хотите узнать больше, вы можете найти дополнительную информацию в разделе «Ошибки и исключения» документации Python.
Обработка исключений
Python — GeeksforGeeks
До сих пор мы исследовали базовый питон от набора 1 до 4 (набор 1 | набор 2 | набор 3 | набор 4).
Ошибка в Python может быть двух типов: синтаксические ошибки и исключения. Ошибки — это проблемы в программе, из-за которых программа останавливает выполнение.С другой стороны, исключения возникают, когда происходят некоторые внутренние события, которые изменяют нормальный ход программы.
Разница между синтаксической ошибкой и исключениями
Синтаксическая ошибка: Как следует из названия, эта ошибка вызвана неправильным синтаксисом в коде. Это приводит к завершению программы.
Пример
|
Выход:
Исключения: Исключения возникают, когда программа синтаксически правильна, но код привел к ошибке. Эта ошибка не останавливает выполнение программы, однако изменяет нормальный ход выполнения программы.
Пример:
|
Выход:
В приведенном выше примере возникла ошибка ZeroDivisionError, поскольку мы пытаемся разделить число на 0.
Примечание. Exception — это базовый класс для всех исключений в Python. Вы можете проверить иерархию исключений здесь.
Попробовать и исключить при обработке исключений
Попробуем получить доступ к элементу массива, индекс которого выходит за пределы, и обработать соответствующее исключение.
|
Выход:
Второй элемент = 2 Произошла ошибка
У оператора try может быть более одного предложения except, чтобы указать обработчики для разных исключений. Обратите внимание, что будет выполняться не более одного обработчика.
|
Выход:
Произошла и обработана ошибка
Если вы измените значение «а» на большее или равное 4, на выходе будет
.
Значение b = Произошла и обработана ошибка
Вывод выше таков, потому что как только python пытается получить доступ к значению b, возникает NameError.
Остальная статья
В python вы также можете использовать предложение else в блоке try-except
, который должен присутствовать после всех предложений except. Код входит в блок else, только если предложение try не вызывает исключения.
|
Результатом вышеуказанной программы будет:
-5,0 a / b результат 0
Наконец ключевое слово в Python
Python предоставляет ключевое слово finally, которое всегда выполняется после блоков try и except. Блок finally всегда выполняется после нормального завершения блока try или после завершения блока try из-за некоторого исключения.
Синтаксис:
пытаться: # Немного кода .... Кроме: # необязательный блок # Обработка исключения (если требуется) еще: # выполнить, если нет исключения наконец-то: # Какой-то код ..... (всегда выполняется)
Пример:
|
Выход:
Нельзя делить на ноль Это всегда выполняется
Повышение исключения
Оператор повышения позволяет программисту вызвать конкретное исключение. Единственный аргумент в строке raise указывает на возникшее исключение. Это должен быть либо экземпляр исключения, либо класс исключения (класс, производный от Exception).
|
Результатом приведенного выше кода будет просто строка, напечатанная как «Исключение», но ошибка выполнения также возникнет в последнем из-за оператора повышения в последней строке.Итак, вывод в вашей командной строке будет выглядеть как
Отслеживание (последний вызов последний): Файл "003dff3d748c75816b7f849be98b91b8. py", строка 4, в Raise NameError ("Привет!") # Вызвать ошибку NameError: Привет
Автор этой статьи Никхил Кумар Сингх (nickzuck_007)
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или если вы хотите поделиться дополнительной информацией по теме, обсужденной выше
Внимание компьютерщик! Укрепите свои основы с помощью курса Python Programming Foundation и изучите основы.
Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS .
Как обрабатывать исключения в Python: подробное визуальное введение
Добро пожаловать! В этой статье вы узнаете, как обрабатывать исключения в Python.
В частности, мы рассмотрим:
- Исключения
- Цель обработки исключений
- Предложение try
- Предложение except
- Предложение else
- Предложение finally
- Как вызывать исключения
Готовы? Давай начнем! 😀
1️⃣ Введение в исключения
Начнем с исключений:
- Что это за ?
- Почему они актуальны?
- Почему вам следует обращаться с ними?
Согласно документации Python:
Ошибки, обнаруженные во время выполнения, называются исключениями и не являются безусловно фатальными.
Исключения возникают, когда программа обнаруживает ошибку во время выполнения. Они нарушают нормальный ход программы и обычно завершают ее внезапно. Чтобы избежать этого, вы можете поймать их и обработать соответствующим образом.
Вы, наверное, видели их во время своих программных проектов.
Если вы когда-либо пытались разделить на ноль в Python, вы, должно быть, видели это сообщение об ошибке:
>>> a = 5/0
Отслеживание (последний вызов последний):
Файл "", строка 1, в
а = 5/0
ZeroDivisionError: деление на ноль
Если вы пытались проиндексировать строку с недопустимым индексом, вы однозначно получили следующее сообщение об ошибке:
>>> a = "Hello, World"
>>> a [456]
Отслеживание (последний вызов последний):
Файл "", строка 1, в
a [456]
IndexError: строковый индекс вне диапазона
Это примеры исключений.
🔹 Общие исключения
Существует множество различных типов исключений, и все они возникают в определенных ситуациях. Некоторые из исключений, которые вы, скорее всего, увидите при работе над своими проектами:
- IndexError - возникает, когда вы пытаетесь проиндексировать список, кортеж или строку за пределами разрешенных границ. Например:
>>> num = [1, 2, 6, 5]
>>> число [56546546]
Отслеживание (последний вызов последний):
Файл "", строка 1, в
число [56546546]
IndexError: индекс списка вне диапазона
- KeyError - возникает, когда вы пытаетесь получить доступ к значению ключа, которого нет в словаре.Например:
>>> student = {"Нора": 15, "Джино": 30}
>>> школьники [«Лиза»]
Отслеживание (последний вызов последний):
Файл "", строка 1, в
студенты [«Лиза»]
KeyError: 'Lisa'
- NameError - возникает, когда имя, на которое вы ссылаетесь в коде, не существует. Например:
>>> a = b
Отслеживание (последний вызов последний):
Файл "", строка 1, в
а = б
NameError: имя 'b' не определено
- TypeError - возникает, когда операция или функция применяется к объекту несоответствующего типа. Например:
>>> (5, 6, 7) * (1, 2, 3)
Отслеживание (последний вызов последний):
Файл "", строка 1, в
(5, 6, 7) * (1, 2, 3)
TypeError: невозможно умножить последовательность на не-int типа 'tuple'
- ZeroDivisionError - возникает при попытке разделить на ноль.
>>> a = 5/0
Отслеживание (последний вызов последний):
Файл "", строка 1, в
а = 5/0
ZeroDivisionError: деление на ноль
💡 Советы: Чтобы узнать больше о других типах встроенных исключений, обратитесь к этой статье в документации Python.
🔸
Анатомия исключения
Я уверен, что вы заметили общую закономерность в этих сообщениях об ошибках. Давайте разберем их общую структуру по частям:
Сначала мы находим эту строку (см. Ниже). Трассировка - это в основном список с подробным описанием вызовов функций, которые были сделаны до возникновения исключения.
Отслеживание помогает вам в процессе отладки, потому что вы можете проанализировать последовательность вызовов функций, которые привели к исключению:
Отслеживание (последний вызов последним):
Затем мы видим эту строку (см. Ниже) с путь к файлу и строка, вызвавшая исключение.В этом случае путь был оболочкой Python
Файл "", строка 1, в
a - 5/0
💡 Совет: Если строка, вызвавшая исключение, принадлежит функции, <модуль> заменяется именем функции.
Наконец, мы видим описательное сообщение с подробным описанием типа исключения и дополнительной информацией, которая поможет нам отладить код:
NameError: имя 'a' не определено
2️⃣ Обработка исключений: цель и контекст
Вы может спросить: зачем мне обрабатывать исключения? Почему мне это полезно? Обрабатывая исключения, вы можете предоставить альтернативный поток выполнения, чтобы избежать неожиданного сбоя вашей программы.
🔹 Пример: пользовательский ввод
Представьте, что произойдет, если пользователь, работающий с вашей программой, введет неверный ввод. Это вызовет исключение, поскольку во время процесса была выполнена недопустимая операция.
Если ваша программа не справится с этим правильно, она внезапно выйдет из строя, и пользователь получит очень разочаровывающий опыт работы с вашим продуктом.
Но если вы все же обработаете исключение, вы сможете предоставить альтернативу для улучшения восприятия пользователя.
Возможно, вы могли бы отобразить описательное сообщение, предлагающее пользователю ввести допустимый ввод, или вы могли бы указать значение по умолчанию для ввода. В зависимости от контекста вы можете выбрать, что делать, когда это произойдет, и в этом заключается магия обработки ошибок. Это может спасти ситуацию, когда случаются неожиданные вещи. ⭐️
🔸 Что происходит за кулисами?
Обычно, когда мы обрабатываем исключение, мы сообщаем программе, что делать, если исключение возникает. В этом случае на помощь придет «альтернативный» поток исполнения.Если не возникает никаких исключений, код будет работать должным образом.
3️⃣ Время писать код: попытка ... except Заявление
Теперь, когда вы знаете, что такое исключения и почему мы должны их обрабатывать, мы начнем погружаться во встроенные инструменты, которые языки Python предлагают для этой цели.
Во-первых, у нас есть самое простое утверждение: попробуйте ... except.
Проиллюстрируем это на простом примере. У нас есть небольшая программа, которая просит пользователя ввести имя студента, чтобы отобразить его / ее возраст:
студентов = {"Нора": 15, "Джино": 30}
def print_student_age ():
name = input ("Пожалуйста, введите имя студента:")
печать (студенты [имя])
print_student_age ()
Обратите внимание на то, что мы не проверяем вводимые пользователем данные в настоящий момент, поэтому пользователь может ввести недопустимые значения (имена, которых нет в словаре), и последствия будут катастрофическими, потому что программа выйдет из строя, если возникнет KeyError. :
# Пользовательский ввод
Пожалуйста, введите имя студента: «Даниэль»
# Сообщение об ошибке
Отслеживание (последний вызов последний):
Файл «<путь>», строка 15, в <модуле>
print_student_age ()
Файл «<путь>», строка 13, в print_student_age
печать (студенты [имя])
KeyError: '"Daniel"'
🔹 Синтаксис
Мы можем справиться с этим с помощью try... Кроме. Это основной синтаксис:
В нашем примере мы добавили бы в функцию оператор try ... except. Давайте разберем это по частям:
студентов = {"Нора": 15, "Джино": 30}
def print_student_age ():
в то время как True:
пытаться:
name = input ("Пожалуйста, введите имя студента:")
печать (студенты [имя])
перемена
Кроме:
print («Это имя не зарегистрировано»)
print_student_age ()
Если мы «увеличим масштаб», мы увидим попытку... кроме выписки:
попробуйте:
name = input ("Пожалуйста, введите имя студента:")
печать (студенты [имя])
перемена
Кроме:
print («Это имя не зарегистрировано»)
- При вызове функции будет выполнено предложение try. Если не возникает никаких исключений, программа будет работать должным образом.
- Но если в предложении try возникает исключение, поток выполнения немедленно переходит к предложению except для обработки исключения.
💡 Примечание: Этот код содержится в цикле while, чтобы продолжить запрашивать ввод пользователя, если значение недействительно.Это пример:
Пожалуйста, введите имя ученика: «Лулу».
Это имя не зарегистрировано
Пожалуйста, введите имя студента:
Это здорово, правда? Теперь мы можем продолжить запрашивать ввод пользователя, если значение недействительно.
В настоящее время мы обрабатываем все возможные исключения с помощью того же пункта except. Но что, если мы хотим обрабатывать только определенный тип исключения? Посмотрим, как это сделать.
🔸 Перехват особых исключений
Поскольку не все типы исключений обрабатываются одинаково, мы можем указать, какие исключения мы хотели бы обрабатывать, с помощью этого синтаксиса:
Это пример. Мы обрабатываем исключение ZeroDivisionError в случае, если пользователь вводит ноль в качестве знаменателя:
def diver_integers ():
в то время как True:
пытаться:
a = int (input ("Пожалуйста, введите числитель:"))
b = int (input ("Пожалуйста, введите знаменатель:"))
печать (а / б)
кроме ZeroDivisionError:
print ("Пожалуйста, введите действительный знаменатель.")
div_integers ()
Результатом будет:
# Первая итерация
Введите числитель: 5
Пожалуйста, введите знаменатель: 0
Пожалуйста, введите действительный знаменатель.# Вторая итерация
Введите числитель: 5
Пожалуйста, введите знаменатель: 2
2,5
Мы справляемся правильно. Но ... если возникает исключение другого типа, программа не справится с ним корректно.
Здесь у нас есть пример ValueError, потому что одно из значений является float, а не int:
Пожалуйста, введите числитель: 5
Пожалуйста, введите знаменатель: 0,5
Отслеживание (последний вызов последний):
Файл «<путь>», строка 53, в <модуле>
div_integers ()
Файл "<путь>", строка 47, в столбце div_integer
b = int (input ("Пожалуйста, введите знаменатель:"))
ValueError: недопустимый литерал для int () с базой 10: '0. 5 '
Мы можем настроить обработку различных типов исключений.
🔹 Несколько предложений за исключением
Для этого нам нужно добавить несколько предложений за исключением
, чтобы по-разному обрабатывать разные типы исключений.
Согласно документации Python:
Оператор try может иметь более одного, за исключением пункта , чтобы указать обработчики для разных исключений. Будет выполнено не более одного обработчика .
В этом примере у нас есть два предложения except.Один из них обрабатывает ZeroDivisionError, а другой обрабатывает ValueError, два типа исключений, которые могут возникать в этом блоке попытки.
def div_integers ():
в то время как True:
пытаться:
a = int (input ("Пожалуйста, введите числитель:"))
b = int (input ("Пожалуйста, введите знаменатель:"))
печать (а / б)
кроме ZeroDivisionError:
print ("Пожалуйста, введите действительный знаменатель. ")
кроме ValueError:
print ("Оба значения должны быть целыми числами.")
div_integers ()
💡 Совет: Вы должны определить, какие типы исключений могут возникать в блоке try, чтобы обработать их надлежащим образом.
🔸 Несколько исключений, одно условие исключения
Вы также можете выбрать обработку различных типов исключений с одним и тем же условием исключения.
Согласно документации Python:
Пункт except может называть множественные исключения как заключенный в скобки кортеж.
Это пример, в котором мы перехватываем два исключения (ZeroDivisionError и ValueError) с одним и тем же , за исключением предложения
:
def diver_integers ():
в то время как True:
пытаться:
a = int (input ("Пожалуйста, введите числитель:"))
b = int (input ("Пожалуйста, введите знаменатель:"))
печать (а / б)
кроме (ZeroDivisionError, ValueError):
print ("Пожалуйста, введите действительные целые числа. ")
divintegers ()
Результат будет одинаковым для двух типов исключений, потому что они обрабатываются одним и тем же предложением except:
Введите числитель: 5
Пожалуйста, введите знаменатель: 0
Пожалуйста, введите действительные целые числа.
Введите числитель: 0,5
Пожалуйста, введите действительные целые числа.
Введите числитель:
🔹 Обработка исключений, вызванных функциями, вызванными в предложении try
Интересным аспектом обработки исключений является то, что если исключение возникает в функции, которая ранее вызывалась в предложении try другой функции и Сама функция не обрабатывает его, вызывающий обработает его, если есть соответствующее предложение except.
Согласно документации Python:
Обработчики исключений обрабатывают не только исключения, если они возникают сразу в предложении try, но также , если они возникают внутри функций, которые вызываются (даже косвенно) в предложении try.
Давайте посмотрим на пример, чтобы проиллюстрировать это:
def f (i):
пытаться:
г (я)
кроме IndexError:
print ("Пожалуйста, введите действительный индекс")
def g (i):
a = "Привет"
вернуть [я]
f (50)
У нас есть функция f
и функция g
. f
вызывает g
в предложении try. С аргументом 50 g
вызовет IndexError, потому что индекс 50 недействителен для строки a.
Но g Сам
не обрабатывает исключение. Обратите внимание, что в функции g
нет оператора try ... except. Поскольку он не обрабатывает исключение, он «отправляет» его на f
, чтобы посмотреть, сможет ли он с ним справиться, как вы можете видеть на диаграмме ниже:
Поскольку f действительно знает, как обрабатывать IndexError, ситуация обрабатывается изящно, и это результат:
Пожалуйста, введите действительный индекс
💡 Примечание: Если f
не обработал исключение, программа внезапно завершилась бы с сообщением об ошибке по умолчанию для IndexError .
🔸 Доступ к конкретным деталям исключений
Исключения - это объекты в Python, поэтому вы можете назначить возникшее исключение переменной. Таким образом, вы можете распечатать описание исключения по умолчанию и получить доступ к его аргументам.
Согласно документации Python:
В разделе except может быть указана переменная после имени исключения . Переменная привязана к экземпляру исключения с аргументами, хранящимися в instance.args.
Здесь у нас есть пример (см. Ниже), в котором мы назначаем экземпляр ZeroDivisionError
переменной e
.Затем мы можем использовать эту переменную в предложении except для доступа к типу исключения, его сообщению и аргументам.
def div_integers ():
в то время как True:
пытаться:
a = int (input ("Пожалуйста, введите числитель:"))
b = int (input ("Пожалуйста, введите знаменатель:"))
печать (а / б)
# Здесь мы назначаем исключение переменной e
кроме ZeroDivisionError как e:
печать (введите (e))
печать (е)
печать (e. аргументы)
div_integers ()
Соответствующий вывод будет:
Пожалуйста, введите числитель: 5
Пожалуйста, введите знаменатель: 0
# Тип
<класс 'ZeroDivisionError'>
# Сообщение
деление на ноль
# Args
('деление на ноль',)
💡 Совет: Если вы знакомы со специальными методами, согласно документации Python: «для удобства экземпляр исключения определяет __str __ ()
, поэтому аргументы могут быть напечатаны напрямую без ссылки .args
. "
4️⃣ Теперь давайте добавим: Предложение else
Предложение else
является необязательным, но это отличный инструмент, поскольку он позволяет нам выполнять код, который должен выполняться только в том случае, если в предложении try не возникло никаких исключений. .
Согласно документации Python:
Оператор
try
…except
имеет необязательный else clause , который, если он присутствует, должен следовать за всеми предложениями except. Это полезно для кода, который должен быть выполнен , если предложение try не вызывает исключения.
Вот пример использования предложения else
:
def diver_integers ():
в то время как True:
пытаться:
a = int (input ("Пожалуйста, введите числитель:"))
b = int (input ("Пожалуйста, введите знаменатель:"))
результат = a / b
кроме (ZeroDivisionError, ValueError):
print ("Пожалуйста, введите действительные целые числа. Знаменатель не может быть равен нулю")
еще:
печать (результат)
div_integers ()
Если исключение не возникает, выводится результат:
Введите числитель: 5
Пожалуйста, введите знаменатель: 5
1.0
Но если возникает исключение, результат не печатается:
Пожалуйста, введите числитель: 5
Пожалуйста, введите знаменатель: 0
Пожалуйста, введите действительные целые числа. Знаменатель не может быть нулем
💡 Совет: Согласно документации Python:
Использование предложения
else
лучше, чем добавление дополнительного кода к предложениюtry
, потому что оно позволяет избежать случайного обнаружения исключения это не было вызвано кодом, защищенным кодомtry
…, за исключением оператора
.
5️⃣ Предложение "finally"
Предложение finally - последнее предложение в этой последовательности. Это , необязательно, , но если вы включите его, оно должно быть последним предложением в последовательности. Предложение finally
- это , всегда выполняется , даже если в предложении try возникло исключение.
Согласно документации Python:
Если присутствует предложение
finally
, предложениеfinally
будет выполняться как последняя задача перед завершением оператораtry
. Предложениеfinally
выполняется независимо от того, вызывает ли операторtry
исключение.
Предложение finally обычно используется для выполнения действий по «очистке», которые всегда должны выполняться. Например, если мы работаем с файлом в предложении try, нам всегда нужно будет закрыть файл, даже если при работе с данными возникло исключение.
Вот пример предложения finally:
def diver_integers ():
в то время как True:
пытаться:
a = int (input ("Пожалуйста, введите числитель:"))
b = int (input ("Пожалуйста, введите знаменатель:"))
результат = a / b
кроме (ZeroDivisionError, ValueError):
print ("Пожалуйста, введите действительные целые числа.Знаменатель не может быть равен нулю ")
еще:
печать (результат)
наконец-то:
print ("Внутри предложения finally")
Divine_integers ()
Это результат, когда не возникало никаких исключений:
Пожалуйста, введите числитель: 5
Пожалуйста, введите знаменатель: 5
1. 0
Внутри предложения finally
Это результат при возникновении исключения:
Введите числитель: 5
Пожалуйста, введите знаменатель: 0
Пожалуйста, введите действительные целые числа.Знаменатель не может быть нулевым
Внутри предложения finally
Обратите внимание, как всегда выполняется предложение finally
.
❗️Важно: помните, что предложение else
и предложение finally
являются необязательными, но если вы решите включить оба предложения, предложение finally должно быть последним предложением в последовательности.
6️⃣ Вызов исключений
Теперь, когда вы знаете, как обрабатывать исключения в Python, я хотел бы поделиться с вами этим полезным советом: вы также можете выбрать, когда вызывать исключения в вашем коде.
Это может быть полезно для определенных сценариев. Давайте посмотрим, как вы можете это сделать:
Эта строка вызовет ValueError с настраиваемым сообщением.
Здесь у нас есть пример (см. Ниже) функции, которая печатает значение элементов списка или кортежа или символы в строке. Но вы решили, что хотите, чтобы список, кортеж или строка имели длину 5. Вы запускаете функцию с оператора if, который проверяет, равна ли длина аргумента data
5.Если это не так, возникает исключение ValueError:
def print_five_items (data):
если len (данные)! = 5:
Raise ValueError («Аргумент должен состоять из пяти элементов»)
для элемента в данных:
печать (элемент)
print_five_items ([5, 2])
Результатом будет:
Traceback (последний вызов последним):
Файл «<путь>», строка 122, в <модуль>
print_five_items ([5, 2])
Файл "<путь>", строка 117, в print_five_items
Raise ValueError («Аргумент должен состоять из пяти элементов»)
ValueError: аргумент должен иметь пять элементов
Обратите внимание, как в последней строке отображается описательное сообщение:
ValueError: аргумент должен иметь пять элементов
Затем вы можете выбрать способ обработки исключения с помощью попытки.