class DeviceError(Exception):
def __init__(self,errno,msg):
self.args = (errno, msg)
self.errno = errno
self.errmsg = msg
# Raises an exception (multiple arguments)
raise DeviceError(1, 'Not Responding')
Beazley:第88页
“将包含参数的元组分配给_是很重要的 init _()到属性self.args,如图所示。打印时使用此属性 异常回溯消息。如果你不明确, 用户将无法看到有关该异常的任何有用信息 发生错误时。“
如果我这样做:
try:
....
except DeviceError:
....
此处 self.args 未使用,因为未生成回溯 - 正确吗? 如果由于某种原因我忽略了DeviceError,那么被调用的 sys.excepthook()函数将需要打印一个Traceback并查看self.args - 是否正确? 它看起来像什么?我的意思是我只是在元组中填充随机值..默认错误处理程序(excepthook函数)如何知道如何显示errno和msg?
有人可以解释一下self.args究竟发生了什么,是否在Python 3.x中使用?
答案 0 :(得分:1)
args
用于基本__str__
类型的__repr__
和Exception
。从C源转换,大致如下:
def __str__(self):
return ("" if len(self.args) == 0 else
str(self.args[0]) if len(self.args) == 1 else
str(self.args))
def __repr__(self):
return "%s%r" % (self.__class__.__name__.split('.')[-1], self.args)
您需要来设置args
,但这意味着您无需编写自己的__str__
或__repr__
。
此外,不是自己设置args
,而应将其传递给父构造函数:
class DeviceError(Exception):
def __init__(self, errno, msg):
super(DeviceError, self).__init__(errno, msg)
self.errno = errno
self.errmsg = msg