2012-01-25 11 views
9

Typowy wzorzec w pythonie polega na wychwyceniu błędu w module wyższego poziomu i ponownym podniesieniu tego błędu jako czegoś bardziej użytecznego.Czy istnieje sposób uzyskiwania dostępu do zagnieżdżonych lub ponownie zgłaszanych wyjątków w pythonie?

try: 
    config_file = open('config.ini', 'r') 
except IOError: 
    raise ConfigError('Give me my config, user!') 

To wygeneruje ślad stosu formy

Traceback (most recent call last): 
    File "<stdin>", line 4, in <module> 
__main__.ConfigError: Give me my config, user! 

Czy istnieje jakiś sposób, aby uzyskać dostęp do zawinięty wyjątku w celu wygenerowania ślad stosu bardziej jak to?

Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
__builtin__.IOError: File Does not exist. 
Exception wrapped by: 
    File "<stdin>", line 4, in <module> 
__main__.ConfigError: Give me my config, user! 

EDIT:

Problem Próbuję porażki jest to, że niektóre 3-cia kod stron może owinąć wyjątki do 3 razy i chcę, aby być w stanie określić przyczynę, czyli sposób ogólny aby sprawdzić stos wyjątków i określić główną przyczynę wyjątku bez konieczności dodawania dodatkowego kodu do modułów zewnętrznych.

+0

w ogóle robi pomoc sys.last_traceback? –

+0

również może sprawdzić [moduł python traceback] (http://docs.python.org/library/traceback.html?highlight=traceback) –

+0

Niestety, jest to jedno z tych irytujących pytań, ale ... dlaczego? – senderle

Odpowiedz

11

ten jest znany jako Wyjątek Chaining i suported w Pythonie 3.

PEP 3134: http://www.python.org/dev/peps/pep-3134/

W Pythonie 2, stary Wyjątkiem jest tracona podczas podnoszenia nowy, chyba że można zaoszczędzić to w bloku except.

+0

Bardzo fajne! Dziękujemy za udostępnienie –

+2

Co masz na myśli mówiąc "zapisz w bloku"? Czy istnieje standardowy sposób na zrobienie tego? –

5

Użyj tracebackmodule. Pozwoli ci to uzyskać dostęp do ostatniego tracebacku i zapisać go w ciągu znaków. Na przykład,

import traceback 
try: 
    config_file = open('config.ini', 'r') 
except OSError: 
    tb = traceback.format_exc() 
    raise ConfigError('Give me my config, user!',tb) 

„zagnieżdżonej” traceback będą przechowywane w tb i przekazywane do ConfigError, gdzie można z nim pracować jednak chcesz.

+0

Również wynik format_exc() (który jest przechowywany w tb) jest po prostu ciągiem, który składa się dokładnie tego samego tekstu, który zostałby wydrukowany, gdyby nie był w bloku try/except. – austin1howard

+0

Aby odpowiedzieć na twoją edycję, o ile mi wiadomo, funkcja format_exc wypisze wszystkie dostępne informacje w tracebacku. Jeśli moduł zewnętrzny "zniesie" niektóre informacje w pętli try/except, nie będzie można go odzyskać bez modyfikowania tej * konkretnej * try/except loop. – austin1howard

Powiązane problemy