2010-10-14 15 views
29

Considere el siguiente código:¿Qué aumenta en Python?

try: 
    raise Exception("a") 
except: 
    try: 
     raise Exception("b") 
    finally: 
     raise 

Esto elevará Exception: a. Esperaba que aumentara Exception: b (¿necesito explicar por qué?). ¿Por qué el último raise elevar la excepción original en lugar de (lo que pensé) fue la última excepción planteada?

+7

Python 3.1 plantea ambos. – kennytm

+1

Ah. Debería haber mencionado que estoy en Python 2.6. – wilhelmtell

+1

Simplemente por curiosidad: el compilador C# en la misma combinación dice "Error: no se permite una instrucción throw sin argumentos en una cláusula finally que está anidada dentro de la cláusula catch más cercana" (throw == raise, catch == except). ¡Sin ambigüedad! – Andrey

Respuesta

15

En python2.6

supongo, que están esperando el bloque finally para ser atado con el bloque "tratar", donde se eleva la excepción "B". El bloque finally se adjunta al primer bloque "try".

Si ha añadido un bloque de excepción en el bloque try interior, entonces el bloque provocará finalmente excepción B.

try: 
    raise Exception("a") 
except: 
    try: 
    raise Exception("b") 
    except: 
    pass 
    finally: 
    raise 

Salida:

Traceback (most recent call last): 
    File "test.py", line 5, in <module> 
    raise Exception("b") 
Exception: b 

Otra variación que se explica qué está sucediendo aquí

try: 
    raise Exception("a") 
except: 
    try: 
    raise Exception("b") 
    except: 
    raise 

Salida:

Traceback (most recent call last): 
    File "test.py", line 7, in <module> 
    raise Exception("b") 
Exception: b 

Si usted ve aquí, en sustitución del bloque finally con excepción plantea la excepción B.

+0

He llegado a la misma conclusión. –

+0

De hecho, esto funciona! Nunca lo hubiera adivinado. ¿Está esto documentado en alguna parte? ¿Es esta una característica o es una necesidad que proviene de problemas en la gramática? – wilhelmtell

+0

¿Por qué la segunda excepción no se limita a sombrear la primera? Ojalá Python se equivoque de sintaxis, o al menos me advierta sobre esto. – wilhelmtell

26

Raise is re-raising the last exception you caught, not the last exception you raised

(publicado en de comentarios para mayor claridad)

Cuestiones relacionadas