Python - Traceback,如何显示导入的文件名

时间:2013-08-22 15:37:45

标签: python error-handling traceback

我有以下内容:

try:
    package_info = __import__('app') #app.py
except:
    print traceback.extract_tb(sys.exc_info()[-1])
    print traceback.tb_lineno(sys.exc_info()[-1])

我从中得到的是:

[('test.py', 18, '<module>', 'package_info = __import__(\'app\')')]
18

现在这几乎是我想要的,这是实际错误开始的地方,但我需要遵循这一点并获得实际感染,即app.py在第17行包含ä而不是18例如。

如果不加以处理,这是我的实际错误消息:

  

第17行的文件C:\ app.py中的非ASCII字符'\ xc3',但未声明编码;有关详细信息,请参阅http://www.python.org/peps/pep-0263.html“,('C:\ app.py',17,1,无))),

我找到了一些例子但是所有这些都显示了影响的点,而不是问题的实际原因,如何解决这个问题(首先是Python2和Python3交叉支持,但Python2在这种情况下更重要)到以与上面的元组类似的方式获取问题的文件名,行和原因?

3 个答案:

答案 0 :(得分:2)

捕获特定异常并查看其具有的信息。该消息是根据异常对象的参数进行格式化的,所以它的好处就是它的存在。在这种情况下,SyntaxError包含文件名属性。

try:
    package_info = __import__('app') #app.py
except SyntaxError, e:
    print traceback.extract_tb(sys.exc_info()[-1])
    print traceback.tb_lineno(sys.exc_info()[-1])
    print e.filename

答案 1 :(得分:0)

对我来说

except Exception as e:
    print e.__unicode__()

可以返回完全相同的消息

答案 2 :(得分:0)

要同时兼容python 2.5和3.x(2.5不支持除e的异常),请使用

try:
    package_info = __import__('app') #app.py

except SyntaxError:
    exc_type, exc, tb = sys.exc_info()
    print(exc)
    print('\n\n'.join(traceback.format_tb(tb, limit=5)))

打印

Non-ASCII character '\xc3' in file /foo/app.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details (app.py, line 2)
  File "foo.py", line 6, in <module>
    package_info = __import__('app') #app.py