Ogólny haczyk dla Pythona


86

Mam bardzo dziwne zachowanie, które wydaje się skutkować cichymi wyjątkami. Jak napisać ogólny try catch, w którym mogę debugować wszystkie wyjątki. Coś w rodzaju:

try:
    # something that fails
except e:
    print e

Trochę więcej szczegółów na temat omawianego problemu:

Mam aplikację Django, która na moim komputerze (Ubuntu Linux 8.10) działa dobrze zarówno przez runerver, jak i mod-python. Na serwerze wdrażania (Ubuntu Linux 8.10) działa dobrze na serwerze wykonawczym, ale kończy się niepowodzeniem przez apache w mod-python.

Zredukowałem przyczynę do części aplikacji, która używa Berkeley DB (bsddb.db) i kluczy pomocniczych. Metoda wywołania zwrotnego dla kluczy pomocniczych używa pickle do formatowania kluczy. Nie udaje się, gdy dzwonię do marynaty na jednej wartości. Jednak kończy się to niepowodzeniem, gdy używam cPickle, a używanie pickle na tych samych wartościach poza funkcją zwrotną również działa.

Chcę tylko wiedzieć, dlaczego nie działa z cPickle.

Odpowiedzi:


164

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

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

zwróć uwagę, że ten format używający assłowa kluczowego jest przeznaczony dla Pythona> 2.6. Stary sposób był:

except Exception, e:

5
nie wiedział o zmianie „Wyjątek jako e”. „Wyjątek, e” zawsze mnie wkurzał, miło widzieć, że zostało wyczyszczone.
monkut

3
Słowo

Takie proste rozwiązanie. Jednak co drugi miesiąc google, klikam górny link i trafiam tutaj.
niCk camel

3

Moduł traceback jest bardzo przydatne do formatowania tracebacks. Następnie możesz zapisać go w pliku dziennika.


1

czy to działa? :

except BaseException, e:

10
Nie powinno się złapać BaseException- obejmuje ona SystemExiti KeyboardInterrupt, co zwykle nie chcesz złapać.
nosklo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.