我想在执行Python代码时拦截异常并做一些报告。主要是我想在发生异常时导出代码的名称空间。
我能做的是以下几点:
我有test.py会引发异常的文件:
for i in range(10):
if i > 5:
j
else:
i
check.py当测试脚本作为参数传递时,将拦截异常并启动调试器的文件:
import sys, pdb
try:
__import__(sys.argv[1])
except Exception as e:
pdb.post_mortem(sys.exc_info()[2])
那很好。
此外,我可以使用以下inspect模块在发生异常的被调用方中找到该框架:
import sys, inspect
try:
__import__(sys.argv[1])
except Exception as e:
callee_frame_tuple = inspect.trace()[1]
print callee_frame_tuple
输出:
(<frame object at 0x00C9B260>, 'C:\\Temp\\test.py', 3, '<module>', [' j\n'], 0)
并使用它来获取有关框架的信息getargvalues():
import sys, inspect
try:
__import__(sys.argv[1])
except Exception as e:
callee_frame_tuple = inspect.trace()[1]
inspect.getargvalues(callee_named_tuple[0])[3]['__builtins__']['locals']()
输出:
{'__builtins__': <module '__builtin__' (built-in)>,
'__doc__': None,
'__file__': 'C:\\Temp\\check.py',
'__name__': '__main__',
'__package__': None,
'e': NameError("name 'j' is not defined",),
'inspect': <module 'inspect' from 'C:\Python27\lib\inspect.pyc'>,
'sys': <module 'sys' (built-in)>}
因此check.py,test.py尽管我将其帧引用用作getargvalues()参数,但我却为被调用方而不是被调用方提供了本地人。
有人知道如何获取被调用方名称空间吗?
慕后森
相关分类