管理python中的错误

时间:2013-11-01 22:07:37

标签: python exception python-3.x error-handling

我需要管理python错误。例如,当我输入:

>>> 1/0

我回复:

Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    1/0
ZeroDivisionError: division by zero

但我需要在变量中保存此错误。 我使用try..except:

>>> try:
    f(0)
except Exception as err:
    print(err)

并在输出中看到:

division by zero

这对我来说还不够。我需要错误的行号,如IDLE(或其他IDE) (我使用python 3.3并且不能使用python 2.7)

2 个答案:

答案 0 :(得分:2)

使用traceback module提取特定信息,例如行号:

>>> try:
...     f(0)
... except Exception as err:
...     import traceback
...     traceback.print_last()
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'float'

答案 1 :(得分:1)

已将保存在变量err中。即使在except阻止之后,它仍然与异常绑定。

(异常上的print没有显示那么多的事实是一个单独的问题。)

然而,听起来你想要追溯对象,而不仅仅是异常对象。这不会自动绑定到变量,但您可以手动执行:

try:
    1/0
except Exception:
    exc_type, exc_value, exc_traceback = sys.exc_info()

有关详细信息,请参阅exc_info

但是traceback对象是一件相当沉重的事情,只要你存储它就会使各种其他重物保持活力。避免像追溯那样重载和链接对象的一种方法是从中提取所需的信息。这就是traceback模块的用途:

try:
    1/0
except Exception:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    exc_traceback = traceback.extract_tb(exc_traceback)

现在我们只带有一小串字符串和数字的元组,而不是追溯对象。

或者,更简单地说,只需立即格式化:

    exc_traceback = traceback.format_tb(exc_traceback)