Разное

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

сумма = 10000

если (сумма> 2999 )

печать ( «Вы имеете право приобрести Dsa Self Paced» )

марок = 10000

a = марок / 0

печать (а)

a = [ 1 , 2 , 3 ]

попробовать :

print "Второй элемент =% d" % (a [ 1 ])

print "Четвертый элемент =% d" % (a [ 3 ])

кроме Ошибка индекса:

печать «Произошла ошибка»

попробовать :

а = 3

если a < 4 :

b = a / (a - 3 )

print "Значение b =" , b

кроме (ZeroDivisionError, NameError):

print "\ nОшибка произошла и обработана"

деф AbyB (a, b):

попробовать :

c = ((a + b) / (a - b))

кроме ZeroDivisionError:

печать "a / b результат 0"

еще :

печать c

AbyB ( 2. 0 , 3,0 )

AbyB ( 3,0 , 3,0 )

попробовать :

к = 5 / / 0

печать (к)

кроме ZeroDivisionError:

печать ( «Невозможно разделить на ноль» )

наконец :

печать ( 'Это всегда выполняется' )

попробовать :

поднять NameError ( «Привет!» )

кроме NameError:

печать «Исключение»

поднять