python显示同样的消息五次_python - 使用不同的类型和消息重新引发异常,保留现有信息...

我还发现很多次我需要对所引发的错误进行“包装”。

这包括在函数范围内,有时只包含函数内的一些行。

创建了一个包装器,用于do2和context manager:

履行

import inspect

from contextlib import contextmanager, ContextDecorator

import functools

class wrap_exceptions(ContextDecorator):

def __init__(self, wrapper_exc, *wrapped_exc):

self.wrapper_exc = wrapper_exc

self.wrapped_exc = wrapped_exc

def __enter__(self):

pass

def __exit__(self, exc_type, exc_val, exc_tb):

if not exc_type:

return

try:

raise exc_val

except self.wrapped_exc:

raise self.wrapper_exc from exc_val

def __gen_wrapper(self, f, *args, **kwargs):

with self:

for res in f(*args, **kwargs):

yield res

def __call__(self, f):

@functools.wraps(f)

def wrapper(*args, **kw):

with self:

if inspect.isgeneratorfunction(f):

return self.__gen_wrapper(f, *args, **kw)

else:

return f(*args, **kw)

return wrapper

用法示例

装饰

@wrap_exceptions(MyError, IndexError)

def do():

pass

当调用do2方法时,不要担心context manager,只需IndexError

try:

do()

except MyError as my_err:

pass # handle error

上下文经理

def do2():

print('do2')

with wrap_exceptions(MyError, IndexError):

do()

内部do2,在context manager,如果IndexError被提出,它将被包裹和提出MyError

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值