如何在Python中通过try/except获取更好的错误信息

8 投票
3 回答
2841 浏览
提问于 2025-04-16 04:03

考虑一下我用来检查存储在 e 中的错误信息的 try/except 代码块。

使用 Try/Catch 获取 e

queryString = "SELECT * FROM benchmark WHERE NOC = 2"
try:
    res = db.query(queryString) 
except SQLiteError, e:
    # `e` has the error info 
    print `e`

这里的 e 对象只包含上面提到的字符串而已。不过,当 Python 报告一个未处理的错误时,它会显示非常详细的信息,如下所示:

Traceback (most recent call last):
  File "fool.py", line 1, in 
    open("abc.zyz", "r")
IOError: [Errno 2] No such file or directory: 'abc.zyz'

我的问题是,我怎么才能获取像上面那样的信息(比如文件名和行号等)?或者,如果 e 包含这些信息,它是如何存储在里面的?

3 个回答

2
  1. 可以看看 traceback 这个库。
  2. 如果你想把错误直接往上抛,而不是去修改它们,可以在 except 块里使用 raise。这样做就像是 except 块根本不存在一样(当然,前面如果有条件判断或者其他操作,还是会有影响)。
3

和前面两个回答一样,使用 traceback。这里有一个更完整的例子。

import traceback

def foo():
    raise RuntimeError('we have a problem')

try:
    foo()
except:
    traceback.print_exc()

当你运行这个代码时,你会看到

Traceback (most recent call last):
  File "C:\0\tmp\x.py", line 6, in <module>
    foo()
  File "C:\0\tmp\x.py", line 3, in foo
    raise RuntimeError('we have a problem')
RuntimeError: we have a problem
10

这段代码会显示出错误的追踪信息。

import traceback

try:
    res = db.query(queryString) 
except SQLiteError, e:
    # `e` has the error info 
    print `e`
    for tb in traceback.format_tb(sys.exc_info()[2]):
        print tb

撰写回答