gpt4 book ai didi

python - 从父函数返回而不引发异常的上下文管理器

转载 作者:太空宇宙 更新时间:2023-11-03 18:24:34 24 4
gpt4 key购买 nike

处理异常时,上下文管理器能否导致其所在的函数返回

我有一个尝试异常(exception)模式,它是我正在编写的几种方法所共有的,我希望用上下文管理器来干燥它。如果出现异常,该函数需要停止处理。

这是我当前实现的示例:

>>> class SomeError(Exception):
... pass
...
>>> def process(*args, **kwargs):
... raise SomeError
...
>>> def report_failure(error):
... print('Failed!')
...
>>> def report_success(result):
... print('Success!')
...
>>> def task_handler_with_try_except():
... try:
... result = process()
... except SomeError as error:
... report_failure(error)
... return
... # Continue processing.
... report_success(result)
...
>>> task_handler_with_try_except()
Failed!

有没有办法干燥 try- except 以便任务处理函数在引发 SomeError 时返回?

注意:任务处理程序由库中的代码调用,该库不处理任务处理程序函数生成的异常。

这是一种尝试,但它会导致 UnboundLocalError:

>>> import contextlib
>>> @contextlib.contextmanager
... def handle_error(ExceptionClass):
... try:
... yield
... except ExceptionClass as error:
... report_failure(error)
... return
...
>>> def task_handler_with_context_manager():
... with handle_error(SomeError):
... result = process()
... # Continue processing.
... report_success(result)
...
>>> task_handler_with_context_manager()
Failed!
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 6, in task_handler_with_context_manager
UnboundLocalError: local variable 'result' referenced before assignment

是否可以使用上下文管理器来干燥此模式,或者是否有替代方案?

最佳答案

不,上下文管理器不能这样做,因为您只能从其主体内的函数返回

但是,您要找的东西确实存在!它称为装饰器。

def handle_errors(func):
def inner(*args, **kwargs):
try:
return func(*args, **kwargs)
except SomeError as error:
report_failure(error)
return
return inner

@handle_errors
def task_handler():
result = process()
report_success(result)
<小时/>

请注意,如果您也总是想report_success,您可以进一步干燥它!

def report_all(func):
def inner(*args, **kwargs):
try:
ret = func(*args, **kwargs)
report_success(ret)
return ret
except SomeError as error:
report_failure(error)
return
return inner

@report_all
def task_handler():
return = process()

您甚至不再需要任务处理程序:

@report_all
def process():
# ...

关于python - 从父函数返回而不引发异常的上下文管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23459447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com