rethrowing python exceção.O que pegar?
Pergunta
Eu estou aprendendo a usar o python.Eu me deparei com este artigo:http://nedbatchelder.com/blog/200711/rethrowing_exceptions_in_python.html Ele descreve rethrowing exceções no python, como este:
try:
do_something_dangerous()
except:
do_something_to_apologize()
raise
Desde que você re-lançar a exceção, não shouold ser um "exterior" pega-exceto de instrução".Mas agora, eu estava pensando.O que acontece se o do_something_to_apologize() dentro da excepto lança um erro.Qual vai ser pego no exterior "catch-exceto"?O que você relançar ou a um lançada por do_something_to_apologize() ?Ou será que a exceção com a mais alta priotiry ser pego primeiro?
Solução
Experimente e veja:
def failure():
raise ValueError, "Real error"
def apologize():
raise TypeError, "Apology error"
try:
failure()
except ValueError:
apologize()
raise
O resultado:
Traceback (most recent call last):
File "<pyshell#14>", line 10, in <module>
apologize()
File "<pyshell#14>", line 5, in apologize
raise TypeError, "Apology error"
TypeError: Apology error
O motivo:o "real" de erro da função original já foi pego pela except
. apologize
levanta uma nova erro antes de o raise
é atingido.Por conseguinte, o raise
no except
cláusula nunca é executado, e apenas o pedido de desculpas do erro se propaga para cima.Se apologize
gera um erro, Python não tem maneira de saber que você estava indo para levantar uma excepção diferente depois apologize
.
Observe que em Python 3, o traço vai mencionar ambos exceções, com uma mensagem explicando como o segundo surgiu:
Traceback (most recent call last):
File "./prog.py", line 9, in <module>
File "./prog.py", line 2, in failure
ValueError: Real error
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "./prog.py", line 11, in <module>
File "./prog.py", line 5, in apologize
TypeError: Apology error
No entanto, a segunda exceção (o "pedido de desculpas" exceção) ainda é o único que se propaga para fora e pode ser capturado por um nível superior except
cláusula.A exceção original é mencionado no traço, mas é parte integrante de um outro, posterior, e não pode mais ser preso.
Outras dicas
A exceção lançada pelo do_something_to_apologize() vai ser pego.A linha que contém levantar nunca será executado, pois a exceção lançada pelo do_something_to_apologize.Também, eu não acredito que haja qualquer idéia de "prioridade" em python exceções.