如果在它最初拋出的函數之外捕獲到異常,則失去對本地堆棧的訪問。因此,不能檢查可能導致異常的變量的值。拋出異常時是否可以自動進入調試器?
是否有辦法來自動啓動中斷調試(import pdb; pdb.set_trace()
)每當異常被拋出來檢查本地堆棧?
更新
感謝您的兩個答案,我爲此+1你,但我發現了一個不同的解決方案。
如果在它最初拋出的函數之外捕獲到異常,則失去對本地堆棧的訪問。因此,不能檢查可能導致異常的變量的值。拋出異常時是否可以自動進入調試器?
是否有辦法來自動啓動中斷調試(import pdb; pdb.set_trace()
)每當異常被拋出來檢查本地堆棧?
更新
感謝您的兩個答案,我爲此+1你,但我發現了一個不同的解決方案。
我發現了什麼,我在回答中尋找到What is the simplest way of using Python pdb to inspect the cause of an unhandled exception?
與總結吧:
<!-- language: lang-py --> def debug_on(*exceptions): if not exceptions: exceptions = (AssertionError,) def decorator(f): @functools.wraps(f) def wrapper(*args, **kwargs): try: return f(*args, **kwargs) except exceptions: pdb.post_mortem(sys.exc_info()[2]) return wrapper return decorator
例子:
@debug_on(TypeError) def buggy_function() .... raise TypeError
你不想對每個異常中斷;慣用的Python代碼大量使用例外(EAFP),所以你會不斷打破不相關的代碼。
相反,使用PDB驗屍:import pdb; pdb.pm()
。這使用sys.last_traceback
來檢查包括當地人在投擲點的堆棧。
IPython中支持該(http://ipython.org)。從裏面IPython中,做
%pdb on
,從那時起,它會自動放棄你在調試器中時,你會得到一個異常。
請注意,您(可能)的這種一般使用快速輪胎......每一次你輸錯的東西,並得到一個語法錯誤的時候,你就必須退出調試。但它有時很有用。
謝謝,我完全在解釋器就像[documentation]中的例子(http://docs.python.org/2/library/pdb.html#debugger ),但我如何在腳本內部執行此操作? – Framester
@Framester你把它放在你想要破壞的腳本中。 ''pdb.set_trace()''''''''''''''''''''''''''''''''在問題中''pdb.set_trace()''應該也能正常工作, – Izkata