当遇到一个如下的exception时,最后一行错误信息是从何而来的呢?
>>> 2 / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
其机理可用一句话描述:ExceptionObject.__class__.__name__ + ': ' + ExceptionObject.__str__()
。
默认情况下,Exception实例初始化时会将参数赋给属性args,实例方法__str__输出args。例如:
>>> try:
... raise Exception("foo", "bar")
... except Exception as e:
... print e.args
... print e.__str__()
... raise
...
('foo', 'bar')
('foo', 'bar')
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
Exception: ('foo', 'bar')
当然,我们可以定义自己的__init__
和__str__
。例如:
>>> class FooException(Exception):
... def __init__(self, errno, message):
... self._errno = errno
... self._message = message
... def __str__(self):
... return repr(self._message)
...
>>> raise FooException(404, "Web Page not found")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
__main__.FooException: 'Web Page not found'