我试图实现一个装饰器异常处理程序来尝试干燥我模块中的异常处理语句(如果相关,这个装饰器可能正在装饰类方法,因此
self
var):
def exception_delegator(operation):
@wraps(operation)
def wrapper(*args, **kwargs):
self = args[0]
try:
return operation(*args, **kwargs)
except (ClientError, ConnectTimeoutError, ReadTimeoutError) as e:
raise MyCustomException(
None,
original_exception=e,
traceback=True,
operation_desc=self.operation_desc,
resource_desc=self.resource_desc,
)
except MyCustomException:
raise MyCustomException(
None,
operation_desc=self.operation_desc,
resource_desc=self.resource_desc,
)
return wrapper
处理程序工作得很好,除非涉及到生成器方法,例如:
@exception_delegator
def list_objects(self):
paginator = self.client.get_paginator('list_objects_v2')
iterator = paginator.paginate(Bucket=self.bucket, Prefix=self.prefix)
for response in iterator:
yield response
我只是希望从生成器方法中引发的异常会被异常处理程序装饰器捕获。
从生成器内部引发的异常不会被捕获并向上传播堆栈调用。我认为这是因为包装方法是生成器的原因是,它适用于普通函数和方法,并且当我在生成器方法本身中实现异常处理时它起作用。
我在这里错过了什么?