Uso de Python para “subir de”

¿Cuál es la diferencia entre raise y raise from en Python?

 try: raise ValueError except Exception as e: raise IndexError 

cuyos rendimientos

 Traceback (most recent call last): File "tmp.py", line 2, in  raise ValueError ValueError During handling of the above exception, another exception occurred: Traceback (most recent call last): File "tmp.py", line 4, in  raise IndexError IndexError 

y

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

cuyos rendimientos

 Traceback (most recent call last): File "tmp.py", line 2, in  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  raise IndexError from e IndexError 

La diferencia es que cuando se usa from , se establece el atributo __cause__ y el mensaje indica que la excepción fue causada directamente por . Si omite el from entonces no se establece __cause__ , pero el atributo __context__ se puede configurar, y el rastreo muestra el contexto y durante el manejo de algo más sucedió .

La configuración de __context__ sucede si usó raise en un controlador de excepciones; si usó raise cualquier otro lugar, tampoco se configura __context__ .

Si se establece un __suppress_context__ = True , un __suppress_context__ = True flag también se establece en la excepción; cuando __suppress_context__ se establece en True , el __context__ se ignora cuando se imprime un rastreo.

Al generar desde un controlador de excepciones en el que no desea mostrar el contexto (no desea que se __suppress_context__ mensaje durante el manejo de otra excepción ), use el __suppress_context__ raise ... from None para establecer __suppress_context__ en True .

En otras palabras, Python establece un contexto en las excepciones para que pueda observar de cerca dónde se generó una 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 rastreo sea explícito sobre la otra excepción (use una redacción diferente), y el contexto se ignora (pero aún se puede realizar una introspección cuando se realiza la depuración). El uso de raise ... from None permite suprimir el contexto que se está imprimiendo.

Ver la documentación de la statement de raise :

La cláusula from se usa para el encadenamiento de excepciones: si se da, la segunda expresión debe ser otra clase o instancia de excepción, que luego se adjuntará a la excepción __cause__ como el atributo __cause__ (que se puede escribir). Si la excepción generada no se maneja, se imprimirán ambas excepciones:

 >>> try: ... print(1 / 0) ... except Exception as exc: ... raise RuntimeError("Something bad happened") from exc ... Traceback (most recent call last): File "", line 2, in  ZeroDivisionError: int division or modulo by zero The above exception was the direct cause of the following exception: Traceback (most recent call last): File "", line 4, in  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__ la nueva excepción:

 >>> try: ... print(1 / 0) ... except: ... raise RuntimeError("Something bad happened") ... Traceback (most recent call last): File "", line 2, in  ZeroDivisionError: int division or modulo by zero During handling of the above exception, another exception occurred: Traceback (most recent call last): File "", line 4, in  RuntimeError: Something bad happened 

También vea la documentación de Excepciones incorporadas para obtener detalles sobre el contexto y la información sobre causas adjuntas a las excepciones.