当你执行类MyException(异常)时初始化self.args的原因是什么?

时间:2013-08-02 08:35:10

标签: python python-3.x

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中使用?

1 个答案:

答案 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