在Python中查找原始异常的模块名称

Rei*_*ica 9 python logging exception introspection stack-trace

例:

>>> try:
...    myapp.foo.doSomething()
... except Exception, e:
...    print 'Thrown from:', modname(e)

Thrown from: myapp.util.url
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,异常实际上是在myapp/util/url.py模块中抛出的.有没有办法获得该__name__模块的?

我的目的是在logging.getLogger功能中使用它.

ars*_*ars 11

这应该工作:

import inspect

try:
    some_bad_code()
except Exception, e:
    frm = inspect.trace()[-1]
    mod = inspect.getmodule(frm[0])
    print 'Thrown from', mod.__name__
Run Code Online (Sandbox Code Playgroud)

编辑:Stephan202提到一个角落案件.在这种情况下,我认为我们可以默认为文件名.

import inspect

try:
    import bad_module
except Exception, e:
    frm = inspect.trace()[-1]
    mod = inspect.getmodule(frm[0])
    modname = mod.__name__ if mod else frm[1]
    print 'Thrown from', modname
Run Code Online (Sandbox Code Playgroud)

问题是如果模块没有加载(因为在读取该文件中的代码时抛出异常),则inspect.getmodule调用返回None.因此,我们只使用违规框架引用的文件名.(感谢你指出这一点,Stephan202!)


Ada*_*eld 7

您可以使用跟踪模块以及以sys.exc_info()编程方式获取回溯:

try:
    myapp.foo.doSomething()
except Exception, e:
    exc_type, exc_value, exc_tb = sys.exc_info()
    filename, line_num, func_name, text = traceback.extract_tb(exc_tb)[-1]
    print 'Thrown from: %s' % filename
Run Code Online (Sandbox Code Playgroud)


Mar*_*ddy 0

这应该可以解决问题:

import inspect
def modname():
    t=inspect.trace()
    if t:
        return t[-1][1]
Run Code Online (Sandbox Code Playgroud)