所以我试图创建一个模块,导入时会导致任何异常掉入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具有此功能(它是SORELY需要的) 任何人都可以帮助我吗?
Edit2:在玩了一堆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
答案 0 :(得分: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)
多田!
我不知道那个气垫船中有多少鳗鱼,但是对于简单的情况它是有效的。