0

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

>>> 1/0

我回馈:

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

但我需要将此错误保存在变量中。我使用try..除了这个:

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

并在输出中查看:

division by zero

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

4

2 回答 2

2

使用该traceback模块提取行号等特定信息:

>>> 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'
于 2013-11-01T22:12:35.673 回答
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)
于 2013-11-01T22:19:31.183 回答