尝试实现导入->调试模式模块

因此,我尝试制作一个模块,该模块在导入时会导致任何异常掉入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)

多田!

我不知道那个气垫船中有多少只鳗鱼,但是对于简单的情况,它是可行的.

上一篇:php-使用Eclipse XDebug逐步执行页面?


下一篇:java-使用外部程序将输入发送到GDB scanf