通用异常处理和异常返回参数

3

我正在尝试创建通用的异常处理程序,可以设置一个参数在发生异常时返回结果,受启发于这个答案

import contextlib


@contextlib.contextmanager
def handler(default):
    try:
        yield
    except Exception as e:
        yield default


def main():
    with handler(0):
        return 1 / 0

    with handler(0):
        return 100 / 0

    with handler(0):
        return 'helllo + 'cheese'

但是这会导致


RuntimeError: generator didn't stop after throw()

我的Python解释器根本不会尝试读取那些语法错误,即使是在最后的位置。(2.7版本,GNU环境下) - Johan Lundberg
@JohanLundberg 确切地说。您使用了什么代码来重现OP的错误? - pydsigner
你可能可以使用自定义上下文管理器类来实现这一点,但不能使用这个装饰器。 - Keith
1个回答

3
主要的概念问题在于您试图在被调用的函数内部隐式地使调用函数返回一个值。举个例子,您所尝试的内容在概念上相当于这种情况:
def f():
    # some magic code here

def g():
    f()

现在你想要一个神奇的代码让g()返回一些值。这是永远不可能的。

上下文管理器不是用于此目的的正确工具。考虑使用装饰器来实现。


@JonClements:好的,我应该更具体一些。当我说“这永远不会起作用”时,我的意思是“你永远无法使那些with块按照你的意图工作”。当然,你可以编写一个包装函数,但我建议使用装饰器。 - Sven Marnach
我认为那不正确。真正的原因是这个装饰器需要一个只产生一个值的生成器。而这个生成器产生了两个值,因此并没有像错误提示中说的那样在结尾处“停止”。 - Keith
1
@rikAtee 嗯,不要理会那段代码!正确的方法是根据你的后续问题使用pdysigner的答案:http://stackoverflow.com/questions/13214377/generic-exception-handling-return-value - Jon Clements
@Keith:我的回答给出了一个原因,解释了为什么上下文管理器无法实现OP想要做的事情。它确实没有回答错误消息是如何产生的,因为我认为一些通用建议在这里更有用。请随意添加您自己的答案,并解释错误的原因。 - Sven Marnach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接