使用Python-pdb检查未处理异常原因的最简单方法是什么



我刚刚将我的所有单元测试数据从JSON转换为YAML,现在我的代码中出现了一个异常。更具体地说,这是打印回溯:

Traceback(最近一次通话最后一次):文件"test/test_addrtools.py",第95行,在test_validate_correctable_addresss中self.assertTrue(self.validator(addr),msg)文件"/Users/tomas/Dropbox/Broadnet/broappy/lib/broapp/addrtools.py",第608行,在__call中__self.validate(addr)validate中的文件"/Users/tomas/Dropbox/Broadnet/broadpy/lib/broappy/addrtools.py",第692行如果是自己_correction_citytype(addr):返回文件"/Users/tomas/Dropbox/Broadnet/broadpy/lib/broappy/addrtools.py",第943行,在_correction_citytypep中ratio=lev_ratio(旧城市,城市)TypeError:ratio应为两个字符串或两个Unicode

现在,第943行的文件"addrtools.py"包含了我的问题的答案。我想在引发异常的范围中查看old_citycity的类型和值。我一直都有这种问题,使用pdb来检查引发异常的范围中的本地人的快速而无痛的方法将在未来为我节省大量时间。


我确实尝试了这个问题答案中发布的解决方案,但死后函数将我放在python2.7/unittest/main.py(231)runTests()中,这对我没有太大帮助。我想这是因为异常是从单元测试代码中捕获并重新引发的。

用包装

def debug_on(*exceptions):
if not exceptions:
exceptions = (AssertionError, )
def decorator(f):
@functools.wraps(f)
def wrapper(*args, **kwargs):
try:
return f(*args, **kwargs)
except exceptions:
pdb.post_mortem(sys.exc_info()[2])
return wrapper
return decorator

示例:

@debug_on(TypeError)
def buggy_function()
....
raise TypeError

unittest超集nose有一个选项,如果您可以使用nose作为测试运行程序,则在测试失败时将您降到pdb

--pdb                 Drop into debugger on errors
--pdb-failures        Drop into debugger on failures

最新更新