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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top