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
Author: Martijn Pieters, 2014-07-15

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.

 99
Author: Martijn Pieters,
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