2011-04-01 110 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