python - 是否可以弃用异常类?

标签 python exception

情况:我的库中有一些自定义异常类,供用户在他们的代码中使用。出于某种原因,我想重命名其中一个异常并弃用旧的。

将旧异常保留为别名并不困难:

class MyNewError(ValueError):
    pass

MyOldError = MyNewError

但最终我想删除我的库的旧错误名称,因此我希望在下游代码中使用此自定义异常的用户收到 DeprecationWarning 通知,告知此错误将被删除。

但我想在以下用例中引发 DeprecationWarning(假设我的包含自定义异常的库称为 mypackage):

# downstream user code
import mypackage

...

try:
    ....
except mypackage.MyOldError:
    ....

所以我想在用户试图捕获错误时发出警告,而不仅仅是在用户引发错误时发出警告。

是否可以通过某种方式做到这一点? (因为用户没有在这里调用我可以提出弃用警告的函数)

最佳答案

您可以应用来自 this answer 的 hack/trick ,将您的模块转换为一个类并拦截 __getattr__() 操作:

我的包/__init__.py:

import sys
import warnings

class MyNewError(ValueError):
    pass

MyOldError = MyNewError

def foo():
    print('mypackage.foo(): raising MyNewError')
    raise MyNewError()

class Wrapper(object):
    def __init__(self, wrapped):
        self.wrapped = wrapped

    def __getattr__(self, name):
        if name == 'MyOldError':
            warnings.warn('MyOldError is deprecated, use MyNewError')

        return getattr(self.wrapped, name)

sys.modules[__name__] = Wrapper(sys.modules[__name__])

测试.py:

import mypackage

try:
    mypackage.foo()
except mypackage.MyOldError:
    print('Caught mypackage.MyOldError')

输出:

$ python test.py 
mypackage.foo(): raising MyNewError
mypackage/__init__.py:18: UserWarning: MyOldError is deprecated, use MyNewError
  warnings.warn('MyOldError is deprecated, please use MyNewError')
Caught mypackage.MyOldError

关于python - 是否可以弃用异常类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40545005/

相关文章:

python - 使用 pyparsing 有什么问题

c# - 为什么没有在闭包中捕获异常?

python - FizzBu​​zz 列表理解

python - 规范化 json 列并与数据帧的其余部分连接

c# - WP8 中的 IsolatedStorageFileStream 不允许操作

java - java中的异常是什么?

c++ - 异常(exception):设备为nullptr。 D3D11中的读取访问冲突

python - 从 numpy 数组中删除连续的数字

Python 数学模块的精妙之处

python - Pandas reshape 柱形