如何在Python中正确地弃用自定义异常?

如何在Python中正确地弃用自定义异常?,python,exception,deprecated,Python,Exception,Deprecated,我在Python项目中有自定义的继承异常,我想弃用其中一个。正确的做法是什么 我有例外情况: 类SDKEException(异常): 通过 类ChildException(sdkeException): 通过 类ChildException(ChildException):#此类将被弃用 通过 考虑到异常在项目中被使用、引发并与其他异常链接,我想弃用ChildException。您可以使用一个装饰器,在异常类的每个实例化上显示一个弃用警告类别: import warnings warning

我在Python项目中有自定义的继承异常,我想弃用其中一个。正确的做法是什么

我有例外情况:

类SDKEException(异常):
通过
类ChildException(sdkeException):
通过
类ChildException(ChildException):#此类将被弃用
通过

考虑到异常在项目中被使用、引发并与其他异常链接,我想弃用ChildException。

您可以使用一个装饰器,在异常类的每个实例化上显示一个弃用警告类别:

import warnings

warnings.filterwarnings("default", category=DeprecationWarning)

def deprecated(cls):
    original_init = cls.__init__
    def __init__(self, *args, **kwargs):
        warnings.warn(f"{cls.__name__} is deprecated", DeprecationWarning, stacklevel=2)
        original_init(self, *args, **kwargs)
    cls.__init__ = __init__
    return cls

class SDKException(Exception):
    pass


class ChildException(SDKException):
    pass

@deprecated
class ChildChildException(ChildException):  # this one is to be deprecated
    pass

try:
    raise ChildChildException()    
except ChildChildException:
    pass
更新: 此外,还可以创建自定义警告类并将其传递给warn函数:

class ExceptionDeprecationWarning(Warning):
    pass
warnings.warn(f"{cls.__name__} is deprecated", ExceptionDeprecationWarning)

将其记录为已弃用。然后,一旦每个使用它的人都有机会删除它的所有用途,只需删除它。这是否回答了你的问题@Prygan这看起来是一个很好的工具,但到目前为止,我认为下面Alex Noname的回答与我的问题更相关。这在定义类时发出警告,而不是在实例化类时发出警告。@Alex Noname不幸的是,这种方法没有为我显示弃用警告。我正在使用Python3.7.5来解决这个问题。我查了你的准确答案solution@AlexNoname对不起,我必须提供更多的细节,我注意到了一些事情。如果在Python控制台中导入异常(如“从应用程序导入ChildException”),然后将其用作“raise childException()”,则不会显示警告。然而,如果我只是使用“python app.py”将您的代码作为一个脚本运行,就会显示出来,我更新了答案并添加了
stacklevel=2
。这更正确,因为使用了函数包装器。@AlexNoname现在可以工作了!还有一件事-在提升类或实例时,如何显示不推荐使用的警告消息?到目前为止,它只适用于该实例。也就是说,“raise childexception()”将显示警告,“raise childexception”将不显示。我想处理这两种情况
class ExceptionDeprecationWarning(Warning):
    pass
warnings.warn(f"{cls.__name__} is deprecated", ExceptionDeprecationWarning)