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
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__toTrue.другими словами, 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