使用kwargs自定义异常(Python)

9
这个安全吗?
class SpecialAlert(Exception):

    def __init__(self, message, **kwargs):
        Exception.__init__(self, message)
        for kw in kwargs:
            if kw == 'message':
                continue
            setattr(self, kw, kwargs[kw])

与以下相关:Proper way to declare custom exceptions in modern Python? 但是,这样安全吗?我的意思是我正在覆盖self的属性?
在SpecialAlert中,我想传递各种东西(这是一个异常,用于进行一系列不同的检查,我在循环中使用"try..except SpecialAlert as error",然后在处理程序中获取错误的详细信息)。
如果我没有覆盖"message",我应该跳过在self上设置其他属性吗?它们是什么?

1
声明的参数不会出现在 **kwargs 中,因此您不需要使用 if kw == 'message' - user2357112
2个回答

12

这将很好地工作; 在对象上添加其他属性是完全有效的。但是,与其专门检查您不想破坏的标准属性,不如最后调用Exception.__init__,如果您意外设置了它们,则让它破坏您自己的属性。然后您的__init__()只需要是:

def __init__(self, message, **kwargs):
    self.__dict__.update(kwargs)
    Exception.__init__(self, message)

5
“cromulent”是什么意思?我以为我懂美国语言。;-) 无论如何,关于这个名为“last”的Exception.__init__问题,非常好,但我链接的这个主要答案没有提到那一点。谢谢! - LetMeSOThat4U
5
“Cromulent”(总是与“perfectly”一起使用)源自《辛普森一家》。“‘Embiggens’?在我来到斯普林菲尔德之前,我从未听说过这个词。” “我不知道为什么,它是一个完全合适的词语。” 当然,它是否实际上意味着“正确”或“可接受”,或者是以反讽的方式使用以表示相反的含义,这是有争议的。 :-) - kindall
Cromulent :DDDDD - Igor Pejic

4

这是完全安全的,您可以为自定义异常实例分配其他属性,只要它不是.args

标准库中有很多自定义异常子类也是如此。例如,urllib2.HTTPError异常添加了codemsgheadersfpfilename属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接