我需要管理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)
答案 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)