Python "поднять из" использования



в чем разница между raise и raise from в Python?



try:
raise ValueError
except Exception as e:
raise IndexError


, который дает



Traceback (most recent call last):
File "tmp.py", line 2, in <module>
raise ValueError
ValueError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "tmp.py", line 4, in <module>
raise IndexError
IndexError


и



try:
raise ValueError
except Exception as e:
raise IndexError from e


, который дает



Traceback (most recent call last):
File "tmp.py", line 2, in <module>
raise ValueError
ValueError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "tmp.py", line 4, in <module>
raise IndexError from e
IndexError
558   1  

1 ответ:

разница в том, что при использовании from на __cause__ атрибут установлен и сообщение гласит, что исключение было непосредственно причиненный. Если вы опустите from тогда нет __cause__ устанавливается, но __context__ атрибут может быть установлен, а затем трассировка показывает контекст как во время работы что-то еще произошло.

задание __context__ произойдет, если вы использовали raise в исключение обработчик; если вы использовали raise нигде нет __context__ устанавливается либо.

если a __cause__ установлен, a __suppress_context__ = True флаг также устанавливается на исключение; когда __suppress_context__ установлено значение True на __context__ игнорируется при печати обратной трассировки.

при вызове из обработчика исключений, где вы не хочу показать контекст (не нужен во время обработки другого исключения сообщение), а затем использовать raise ... from None установить __suppress_context__ to True.

другими словами, Python устанавливает a контекст на исключениях, чтобы вы могли интроспектировать, где возникло исключение,позволяя вам увидеть, было ли заменено другое исключение. Вы также можете добавить причина исключения, делая вывод о явной другое исключение (использовать другую формулировку), и контекст игнорируется (но еще может быть анализировался при отладке). Используя raise ... from None позволяет подавить контекст бытия напечатанный.

посмотреть raise утверждение документации:

The 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: int division or modulo 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

подобный механизм работает неявно, если исключение возникает внутри обработчика исключений: > предыдущее исключение затем присоединяется как новое исключение :

>>> try:
...     print(1 / 0)
... except:
...     raise RuntimeError("Something bad happened")
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ZeroDivisionError: int division or modulo by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened

Смотрите также встроенная документация исключений для получения дополнительной информации о контексте и причине, прикрепленной к исключениям.

Comments

    Ничего не найдено.