2013-09-23 51 views
4

如果在它最初拋出的函數之外捕獲到異常,則失去對本地堆棧的訪問。因此,不能檢查可能導致異常的變量的值。拋出異常時是否可以自動進入調試器?

是否有辦法來自動啓動中斷調試(import pdb; pdb.set_trace())每當異常被拋出來檢查本地堆棧?

更新

感謝您的兩個答案,我爲此+1你,但我發現了一個不同的解決方案。

回答

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 
10

你不想對每個異常中斷;慣用的Python代碼大量使用例外(EAFP),所以你會不斷打破不相關的代碼。

相反,使用PDB驗屍:import pdb; pdb.pm()。這使用sys.last_traceback來檢查包括當地人在投擲點的堆棧。

+0

謝謝,我完全在解釋器就像[documentation]中的例子(http://docs.python.org/2/library/pdb.html#debugger ),但我如何在腳本內部執行此操作? – Framester

+0

@Framester你把它放在你想要破壞的腳本中。 ''pdb.set_trace()''''''''''''''''''''''''''''''''在問題中''pdb.set_trace()''應該也能正常工作, – Izkata

6

IPython中支持該(http://ipython.org)。從裏面IPython中,做

%pdb on 

,從那時起,它會自動放棄你在調試器中時,你會得到一個異常。

請注意,您(可能)的這種一般使用快速輪胎......每一次你輸錯的東西,並得到一個語法錯誤的時候,你就必須退出調試。但它有時很有用。

相關問題