2011-04-01 109 views
3

所以我試圖做一個模塊,導入時,會導致任何異常,以放入pdb。我想它會看起來像這樣:試圖執行導入 - >調試模式模塊

#file A.py 
import pdbOnException 

a = 1/0 
print a 

#file pdbOnException 
import sys, pdb 

magic_object = # do magic stuff to get an object that, when called, does what I want :D 

try: 
    magic_object() 
except: 
    tb = sys.exc_info()[2] 
    pdb.post_mortem(tb) 

希望這是相當明顯的,我想要做的。我試圖做到這一點,以便任何導入此模塊的模塊將其未處理的異常轉到pdb。

編輯:我想我應該補充我想用的東西,看看你是否知道這件事。我打算在eclipse的「Forced Builtins」中加入這個模塊,這樣eclipse就會擁有這個功能(這是需要的) 任何人都可以幫助我嗎?編輯2:在玩eclipse後,看起來好像沒有辦法強制eclipse在運行任何代碼之前運行一組代碼(即像PYTHONSTARTUP)。這很糟糕。所以我想我會去裝修。

如果您仍然對如何通過導入模塊來實現這一點有所瞭解,那麼我就是所有人。它可以添加到IDLE啓動腳本中。

更新: 我剛剛得到了一些使用裝飾器的東西,但用戶必須調用它的主要功能(這不是世界的盡頭......但我想要更多的功能)。它是:

def pdb_on_exception(function): 
    def returnfunction(*args, **kwargs): 
     try: 
      return function(*args, **kwargs) 
     except Exception as E: 
      traceback.print_tb(sys.exc_info()[2]) 
      print E 
      tb = sys.exc_info()[2] 
      pdb.post_mortem(tb) 
    return returnfunction 

如果正在裝飾的函數存在未處理的異常,這將使您進入pdb。這是很酷,但仍然不是我想要的:d

+2

類似於你的裝飾器,你也可以設計一個上下文管理器來做到這一點。我看不出有什麼方法可以使它們伸出並影響導入模塊 - 您需要修改Eclipse以使用新的上下文管理器來包裝所有導入模塊的執行。 – ncoghlan 2011-04-01 18:00:15

+0

我希望我知道如何修改eclipse來做到這一點...我正在做更多的更新與我的更多嘗試。 – 2011-04-01 18:45:02

回答

3

這是相當瑣碎,你只掛到sys.excepthook:

fullofeels.py:

import sys, pdb 

def except_hook(exctype, value, traceback): 
    if previous_except_hook: 
     previous_except_hook(exctype, value, traceback) 

    pdb.post_mortem(traceback) 

previous_except_hook = sys.excepthook 
sys.excepthook = except_hook 

用法:

通常我們只是得到一個回溯:

>>> 1/0 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ZeroDivisionError: integer division or modulo by zero 

但進口fullofeels,我們陷入PDB:

>>> import fullofeels 
>>> 1/0 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ZeroDivisionError: integer division or modulo by zero 
> <stdin>(1)<module>() 
(Pdb) 

田田!

我不知道該氣墊船有多少個鰻魚,但對於簡單情況下它的工作原理。

+0

如果你瞭解excepthook,這只是一件容易的事!萬分感謝! (我還不滿意,但我會盡快) – 2011-04-01 23:06:07

+0

哦,非常好 - 我甚至沒有想過'excepthook',因爲我從執行腳本的角度來看待它,而不是一個交互式提示。 – ncoghlan 2011-04-02 03:07:36

+0

@Garrett:既然你問了這個問題,你應該有一個「接受答案」按鈕,你可以點擊。 – ncoghlan 2011-04-02 03:08:35