9

例子:

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

Thrown from: myapp.util.url

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

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

4

5 回答 5

11

这应该有效:

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!)

于 2009-07-08T05:19:23.923 回答
7

您可以使用traceback 模块以及 以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
于 2009-07-08T01:15:58.167 回答
0

这应该可以解决问题:

import inspect
def modname():
    t=inspect.trace()
    if t:
        return t[-1][1]
于 2009-07-08T01:06:58.827 回答
0

Python 的日志记录包已经支持这一点——查看文档。您只需%(module)s在格式字符串中指定。但是,这会为您提供捕获异常的模块- 不一定与引发异常的模块相同。当然,回溯会为您提供引发异常的精确位置。

于 2009-07-08T06:01:38.660 回答
-1

我在公司博客上有一个关于 CrashKit 如何从 Python 堆栈跟踪计算类名和包名的故事:“<a href="http://blog.yoursway.com/2009/07/python-stack-trace-saga. html" rel="nofollow noreferrer">Python 堆栈跟踪传奇"。包括工作代码。

于 2009-07-23T01:36:25.583 回答