当前位置: 首页 > 面试题库 >

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

陈飞语
2023-03-14
问题内容

在现代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,但我从未知道如何使用它。我也不确定这是前进的正确方法。我在网上发现的很多讨论都表明他们正在尝试消除Python 3中的args。

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


问题答案:

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

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

这样,你可以将错误消息的字典传递给第二个参数,并在以后使用 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


 类似资料:
  • 本文向大家介绍Python自定义一个异常类的方法,包括了Python自定义一个异常类的方法的使用技巧和注意事项,需要的朋友参考一下 如何实现自定义一个异常 python内置了许多异常类,为编写代码划定红线,才使调试代码时能及时发现错误。那么我们编写一个模块也可以为使用此模块者划定红线,来约束使用者可用哪些数据,这就需要自定义异常类型。 首先需要了的是自定义类是的父类: python说明文档中是这样

  • 我正在考虑将Auth0用于我的API和web应用程序,并进行查询。生成Jwt令牌时,我希望包含一些仅存在于我的用户数据库中的自定义用户声明。这是可能的,还是所有声明都需要作为Auth0中的预定义属性存在。 我有自己的用户数据库,因为我需要在那里存储一些动态和复杂的用户权限。我意识到一个选择是不将这些权限存储在令牌中,我可以有一个单独的api来获取它们,但是为了性能和简单性,我宁愿将它们包装到Jwt

  • 问题内容: PEP 263定义了如何声明Python源代码编码。 通常,Python文件的前两行应以: 但是我看过很多以以下内容开头的文件: => 编码而不是编码。 那么,声明文件编码的正确方法是什么? 是了编码允许的,因为所使用的正则表达式是懒惰?还是仅仅是声明文件编码的另一种形式? 我问这个问题是因为PEP不在谈论编码,它只是在谈论编码。 问题答案: 在这里检查文档: “如果Python脚本的

  • 问题内容: 我有一个快速的问题。在静态关键字声明之后立即开始的代码块,那是什么类型的方法?我从未见过。如果有人能启发我,将不胜感激。谢谢。 问题答案: 这不是方法,而是类的静态Initializer块。您可以在Java Language Specification中 阅读有关它的更多信息。 加载该类后,其中的代码将执行一次。

  • 请问在Spring webflux中抛出选中的自定义异常的正确方法是什么?我想坚持,这是关于检查自定义异常,如MyException。java,而不是RuntimeException,它是关于抛出异常,而不是处理异常。 我尝试了以下方法: 这是不可能的,因为get秒dStepFromFirstStepAfterCheck方法中存在未处理的异常。 如果我抛出并传播,私有的SecondStep get

  • 本文向大家介绍Python异常继承关系和自定义异常实现代码实例,包括了Python异常继承关系和自定义异常实现代码实例的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Python异常继承关系和自定义异常实现代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 主要介绍 python 中异常的继承关系,及如何自定义异常 1. 异常的继