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

时间:2009-07-08 00:55:17

标签: python exception logging stack-trace introspection

示例:

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

Thrown from: myapp.util.url

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

我的意图是在logging.getLogger函数中使用它。

5 个答案:

答案 0 :(得分:10)

这应该有效:

import inspect

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

编辑: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

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

答案 1 :(得分:7)

您可以使用traceback modulesys.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

答案 2 :(得分:0)

这应该可以解决问题:

import inspect
def modname():
    t=inspect.trace()
    if t:
        return t[-1][1]

答案 3 :(得分:0)

Python的日志包已经支持这一点 - 请查看documentation。您只需在格式字符串中指定%(module)s即可。但是,这会为您提供 catch 异常的模块 - 不一定与引发的模块相同。当然,回溯可以为您提供引发异常的准确位置。

答案 4 :(得分:0)

我有一个关于CrashKit如何从公司博客上的Python堆栈跟踪计算类名和包名称的故事:“Python stack trace saga”。包含工作代码。