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

标签 python exception

在现代 Python 中声明自定义异常类的正确方法是什么?我的主要目标是遵循其他异常类所具有的任何标准,以便(例如)我在异常中包含的任何额外字符串都会被捕获异常的任何工具打印出来。

我所说的“现代 Python”是指可以在 Python 2.5 中运行但对于 Python 2.6 和 Python 3.* 做事方式“正确”的东西。 “自定义”是指一个 Exception 对象,它可以包含有关错误原因的额外数据:一个字符串,也可能是与异常相关的其他一些任意对象。

我被 Python 2.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 的属性具有特殊含义,这似乎很疯狂。我从 PEP-352 收集该属性在他们试图弃用的 2.5 中确实具有特殊含义,所以我猜这个名称(以及那个名称)现在被禁止了?呃。

我也模糊地知道 Exception 有一些神奇的参数 args,但我从来不知道如何使用它。我也不确定这是否是 future 做事的正确方式;我在网上找到的很多讨论都表明他们试图在 Python 3 中取消 args。

更新:两个答案建议覆盖 __init____str__/__unicode__/__repr__。好像打字很多,有必要吗?

最佳答案

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

class MyException(Exception):
    pass

要覆盖某些内容(或传递额外的参数),请执行以下操作:

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

这样您就可以将错误消息的字典传递给第二个参数,稍后使用 e.errors 获取它。

在 Python 2 中,您必须使用这种稍微复杂的 super() 形式:

super(ValidationError, self).__init__(message)

关于python - 在现代 Python 中声明自定义异常的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1319615/

相关文章:

c# - 什么相当于 python 中的 C# 任务

python - 微服务的 Airflow 架构

python - python中二进制文件的异或加密

python - 我们能在列表中找到素数吗?

java - 如何在迭代此集合时避免 ConcurrentModificationException?

python - 在复平面加corr中找到A(x)和B(y)的交点。 x和y

Java 异常处理(用户输入中的空格)

C++ 在不使用智能指针的情况下清理 try catch block 中的内存。

java - 单击按钮后弹出异常(java fx)

c# - 在 c# 6.0 中使用异常过滤(使用 typeof())VS。捕获自定义异常