2009-01-14 32 views
48

我有一些非常奇怪的行爲,似乎導致無聲的異常。我如何編寫一個通用的try catch來調試所有異常。沿着線的東西:python的通用catch

try: 
    # something that fails 
except e: 
    print e 

詳細瞭解一下手頭的問題詳細:

我有一個Django應用程序,在我的補償(Ubuntu Linux操作系統8.10)均通過runserver命令和國防部工作正常-蟒蛇。在部署服務器(Ubunut Linux 8.10)上,它通過runserver正常工作,但通過mod-python中的apache失敗。

我已經將原因縮減爲使用Berkeley DB(bsddb.db)和輔助鍵的應用程序的一部分。輔助鍵的回調方法使用pickle來格式化鍵。我在一個值上調用pickle時失敗。但是,它只會在我使用cPickle時失敗,並且對回調函數外的相同值使用pickle也可以。

我只是想知道爲什麼它與cPickle失敗。

回答

91

在程序終止前,已經默認打印了異常。如果你想在其他地方發送錯誤(不打印),你可以這樣做:

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

注意,這種格式使用as關鍵字是蟒蛇> 2.6。舊的方法是:

except Exception, e: 
1

這是行不通的嗎? :

except BaseException, e: 
+5

你不應該捕獲`BaseException` - 它包括`SystemExit`和`KeyboardInterrupt`,你通常不想捕獲的東西。 – nosklo 2009-10-29 10:45:56

+0

@nosklo你是對的 – 2009-11-07 13:17:28

2

traceback module對格式化回溯特別有用。然後您可以將其寫入日誌文件。