为了账号安全,请及时绑定邮箱和手机立即绑定

在现代Python中声明自定义异常的正确方法?

在现代Python中声明自定义异常的正确方法?

沧海一幻觉 2019-07-05 16:36:59
在现代Python中声明自定义异常的正确方法?在现代Python中声明自定义异常类的正确方法是什么?我的主要目标是遵循其他异常类所具有的任何标准,以便(例如)异常中包含的任何额外字符串都由捕获异常的任何工具打印出来。所谓“现代Python”,我指的是在Python2.5中运行的东西,但是对于Python2.6和Python3.*来说,它是‘正确的’。所谓“自定义”,我指的是一个异常对象,它可以包含关于错误原因的额外数据:字符串,也可能是其他一些与异常相关的任意对象。我被Python2.6.2中的以下弃用警告给绊倒了:>>> class MyError(Exception):...     def __init__(self, message):...         self.message = message...  >>> MyError("foo")_sandbox.py:3: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6似乎很疯狂BaseException对于名为message..我从佩普-352这个属性在2.5中确实有一个特殊的含义,他们试图贬低它,所以我想这个名字(和那个名字)现在被禁止了?啊。我也模糊地意识到Exception有一些神奇的参数args,但我从来不知道如何使用它。我也不确定这是今后做事情的正确方法;我在网上发现的许多讨论表明,他们试图废除Python 3中的args。更新:有两个答案建议重写__init__,和__str__/__unicode__/__repr__..这似乎是大量的打字,有必要吗?
查看完整描述

3 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

也许我错过了这个问题,但为什么不呢?

class MyException(Exception):
    pass

编辑:若要重写某些内容(或传递额外的args),请执行以下操作:

class ValidationError(Exception):
    def __init__(self, message, errors):

        # Call the base class constructor with the parameters it needs
        super(ValidationError, self).__init__(message)

        # Now for your custom code...
        self.errors = errors

这样,您就可以将错误消息块传递给第二个Param,然后用e.errors


Python 3更新:在Python 3+中,您可以使用稍微紧凑的super():

class ValidationError(Exception):
    def __init__(self, message, errors):

        # Call the base class constructor with the parameters it needs
        super().__init__(message)

        # Now for your custom code...
        self.errors = errors


查看完整回答
反对 回复 2019-07-05
  • 3 回答
  • 0 关注
  • 1012 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信