在生成器中引发异常,在python中处理其他地方,反之亦然

8 python yield exception generator

我正在思考一个更先进的方向,也很难找到解决这个问题的方法.在做出任何决定之前,我想过要求专家建议来解决这个问题.

增强型生成器具有新方法.send()和.throw(),允许调用者传递消息或将异常引入生成器(协同程序).

从python文档:这可以非常方便,尤其是.throw()方法,它请求生成器处理调用者中引发的异常.

请求#1:上述语句的任何示例代码.我没有找到任何代码片段来解释这个问题.

但是,我也在考虑反问题:生成器是否可以引发异常,将其传递给调用者,让调用者"修复"它,并继续生成器自己的执行?这就是我想称之为"反向投掷".

请求#2:上述语句的任何示例代码.我没有找到任何代码片段来解释这个问题.

简单地在生成器中引发异常就不行了.我尝试在生成器中"引发SomeException",但这不起作用,因为在"加速"之后,生成器无法再执行---它只是停止,并且进一步尝试运行生成器会导致StopIteration异常.换句话说,"加注"比"收益"更致命:一个人可以在屈服于来电者后恢复自己,但是"加注"将自己发送到死胡同.

我想知道是否有简单的方法在Python中进行"反向投掷"?这将使我们能够通过互相抛出异常来编写协同程序.但为什么要使用例外?好吧,我不知道......这一切都是从一些粗略的想法开始的.

案例研究代码:

class MyException(Exception):pass


def handleError(func):
''' handle an error'''
    errors =[]
    def wrapper(arg1):
        result = func(arg1)

        for err in findError(result):
            errors.append(err)

        print errors
        return result

    return wrapper

def findError(result):
'''
Find an error if any
'''
    print result
    for k, v in result.iteritems():
        error_nr = v % 2
        if error_nr ==0:
            pass
        elif error_nr > 0:
            yield MyException

@handleError
def numGen(input):

''' This function take the input and generates 10 random numbers. 10 random numbers are saved in result dictionary with indices. Find error decorator is called based on the result dictionary'''

    from random import randint
    result= {}
    errors = []
    for i in range(9):
        j = (randint(0,4))
        result[i] = input + j
    return result

if __name__ == '__main__':
    numGen(4)
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释基于案例研究示例的想法(在发电机中引发异常并在其他地方处理它反之亦然)?我确实期望这两种方法都是亲和的.

提前致谢.

寻找可信和/或官方来源的答案.

L3v*_*han 0

请求 #1(.throw() 示例)

我从未真正使用过它,但事后您可以使用它来改变生成器中的行为。当然,您也可以这样做.send,但是您需要在表达式行中处理它yield(可能位于代码中的多个位置),而不是使用 try- except 块集中处理。

def getstuff():
    i=0
    try:
        while True:
            yield i
            i+=1
    except ValueError:
        while True:
            yield i**2
            i+=1

generator = getstuff()

print("Get some numbers...")
print(next(generator))
print(next(generator))
print(next(generator))

print("Oh, actually, I want squares!")
print(generator.throw(ValueError))
print(next(generator))
print(next(generator))
Run Code Online (Sandbox Code Playgroud)