13

Say mam trochę kodu:python: odzyskać wyjątek od bloku try czy wreszcie blok podnosi wyjątek

try: 
    try: 
     raise Exception("in the try") 
    finally: 
     raise Exception("in the finally") 
except Exception, e: 
    print "try block failed: %s" % (e,) 

wyjście jest:

try block failed: in the finally 

z punktu tej instrukcji print, jest jest jakikolwiek sposób na uzyskanie dostępu do wyjątku podniesionego podczas próby, czy też zniknął na zawsze?

UWAGA: Nie mam na myśli przypadku użycia; to tylko ciekawość.

Odpowiedz

14

nie mogę znaleźć żadnych informacji o tym, czy ta została przeniesiona i nie mają instalacja PY2 przydatny, ale w Pythonie 3 e ma atrybut o nazwie e.__context__, tak że:

try: 
    try: 
     raise Exception("in the try") 
    finally: 
     raise Exception("in the finally") 
except Exception as e: 
    print(repr(e.__context__)) 

daje :

Exception('in the try',) 

Według PEP 3314 przed __context__ dodano informacje o oryginalnym wyjątku był niedostępny.

+0

ładne, ale tylko py3. i tak: +1. – ch3ka

+1

ah, miło. więc według tego PEP, odpowiedź brzmi: "nie możesz, w Py2, ale możesz w Py3". dzięki! – Claudiu

0
try: 
    try: 
     raise Exception("in the try") 
    except Exception, e: 
     print "try block failed" 
    finally: 
     raise Exception("in the finally") 
except Exception, e: 
    print "finally block failed: %s" % (e,) 

Jednak byłby to dobry pomysł, aby uniknąć konieczności kodu, która może rzucić wyjątek w bloku finally - zazwyczaj wystarczy użyć go zrobić porządki itp tak.

+2

Po prostu przełyka wyjątek '' in try '', zanim dotrze do bloku finally. –

Powiązane problemy