如何在Python中使用try / catch获得更好的错误信息

时间:2010-09-13 01:37:51

标签: python error-handling

考虑我用于检查e中存储的错误消息的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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:2)

  1. 请参阅traceback库。
  2. 如果您只是想在链中传递错误而不是修改它们,您可以在raise块中使用except,然后其行为就像except块isn'那里(除了raise之前你可能做过的任何条件逻辑/副作用)。