因此,我尝试制作一个模块,该模块在导入时会导致任何异常掉入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具有此功能(非常需要)
谁能帮我吗?
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
解决方法:
这很简单,您只需挂接到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)
多田!
我不知道那个气垫船中有多少只鳗鱼,但是对于简单的情况,它是可行的.