2009-01-14 15 views
48

Mam dziwne zachowanie, które wydaje się powodować ciche wyjątki. Jak mogę napisać ogólną próbę catch, w której mogę debugować wszystkie wyjątki. Coś wzdłuż linii:Ogólny połów dla pytona

try: 
    # something that fails 
except e: 
    print e 

nieco więcej o tym problemie w zasięgu ręki w szczegółach:

Mam app Django, że na moim komp (Ubuntu 8.10) działa dobrze zarówno przez uruchomieniowego i mod -pyton. Na serwerze wdrażania (Ubunut Linux 8.10) działa dobrze przez runserver, ale kończy się niepowodzeniem poprzez apache w mod-python.

Sprowadziłem przyczynę do części aplikacji, która używa Berkeley DB (bsddb.db) i kluczy pomocniczych. Metoda wywołania zwrotnego dla kluczy dodatkowych używa pikle do sformatowania kluczy. Zawodzi, gdy zadzwonię na pikle na jednej wartości. Jednak kończy się to niepowodzeniem tylko wtedy, gdy używam cPickle i działa również pikle na tych samych wartościach poza funkcją wywołania zwrotnego.

Po prostu chcę wiedzieć, dlaczego nie działa z cPickle.

Odpowiedz

91

Wyjątki są już drukowane domyślnie przed zakończeniem programu. Jeśli chcesz wysłać błąd gdzie indziej (nie go wydrukować) można to zrobić:

try: 
    something() 
except Exception as e: 
    send_somewhere(traceback.format_exception(*sys.exc_info())) 
    raise # reraises the exception 

wiadomości, że ten format za pomocą słowa kluczowego as jest dla pytona> 2.6. Stary sposób był:

except Exception, e: 
+0

Pokonaj mnie. :) –

+3

nie wiedział o zmianie "Wyjątek jako e". "Wyjątek, e" zawsze mnie podsłuchiwał, miło widzieć, że został oczyszczony. – monkut

+3

Słowo kluczowe "as" jest dla Pythona> = 2.6 – pixelbeat

1

Czy to działa? :

except BaseException, e: 
+5

Nie powinieneś łapać 'BaseException' - zawiera on' SystemExit' i 'KeyboardInterrupt', rzeczy, których zwykle nie chcesz przechwytywać. – nosklo

+0

@nosklo Masz rację –

2

Model traceback module jest bardzo przydatny do formatowania elementów śledzących. Możesz następnie zapisać go w pliku dziennika.