Uso de Python "subir desde"
¿Cuál es la diferencia entre raise
y raise from
en Python?
try:
raise ValueError
except Exception as e:
raise IndexError
Que rinde
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
Y
try:
raise ValueError
except Exception as e:
raise IndexError from e
Que rinde
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 answers
La diferencia es que cuando se utiliza from
, el __cause__
se establece el atributo y el mensaje indica que la excepción fue causada directamente por. Si se omite el from
entonces no __cause__
se establece, pero el __context__
el atributo también se puede establecer, y el seguimiento muestra el contexto como durante el manejo de algo más sucedió.
Establecer el __context__
sucede si utilizaste raise
en un controlador de excepciones; si utilizaste raise
en cualquier otro lugar no se establece __context__
bien.
Si se establece un __cause__
, también se establece un indicador __suppress_context__ = True
en la excepción; cuando __suppress_context__
se establece en True
, el __context__
se ignora al imprimir un seguimiento.
Al subir desde un controlador de excepciones donde no quiere mostrar el contexto (no quiere un durante el manejo de otra excepción ocurrió mensaje), entonces use raise ... from None
para establecer __suppress_context__
a True
.
En otras palabras, Python establece un contexto {[26] } en excepciones para que pueda hacer introspección donde un se planteó la excepción, lo que le permite ver si otra excepción fue reemplazada por ella. También puede agregar una causa a una excepción, haciendo que el seguimiento sea explícito sobre la otra excepción (use una redacción diferente), y el contexto se ignora (pero aún se puede hacer introspección al depurar). Usar raise ... from None
le permite suprimir el contexto que se está imprimiendo.
Ver el raise
declaración documenation:
La cláusula
from
se utiliza para el encadenamiento de excepciones: si se la segunda expresión debe ser otra clase o instancia de excepción, que luego se adjuntará a la excepción planteada como el atributo__cause__
(que se puede escribir). Si la excepción planteada no se maneja, ambas excepciones se imprimirán:>>> 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
Un mecanismo similar funciona implícitamente si se genera una excepción dentro de un controlador de excepciones: > la excepción anterior se adjunta como el atributo
__context__
de la nueva excepción:>>> 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
También ver el Incorporado Exceptions documentation para detalles sobre el contexto y la causa de la información adjunta a las excepciones.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-15 07:59:16