如何在协程中捕获 throw 和其他异常并获得 1 的产量?

问题描述 投票:0回答:1

我有 var DICTIONARY,它是一个字典,其中键是英文字母,值是以相应字母开头的单词。 DICTIONARY 的初始填充如下所示:

DICTIONARY = {
    'a': 'apple',
    'b': 'banana',
    'c': 'cat',
    'd': 'dog',
}

我的代码有 2 个 while 循环,因为更高的 try- except 会结束整个生成器循环:

def alphabet():
    while True:
        try:
            letter = yield  #waiting for first input from send
            while True:
                try:
                    letter = yield DICTIONARY[letter]
                except KeyError:  
                    letter = yield 'default'  # return 'default', if key is not found
                except Exception:
                    letter = yield 'default'
        except KeyError:
            letter = yield 'default' 
        except Exception:
            letter = yield 'default' 

但是对于输入:

coro = alphabet()
next(coro)
print(coro.send('apple'))
print(coro.send('banana'))
print(coro.throw(KeyError))
print(coro.send('dog'))
print(coro.send('d'))

预期输出:

default
default
default
default
dog

但我没有发现最后一个默认值 - 它是“无”:

default
default
default
None
dog

出了什么问题?

python coroutine yield
1个回答
0
投票

我认为问题在于生成器堆栈在先前的收益函数上。如果您添加更多

next
调用,问题即可解决:

coro = alphabet()
next(coro)
print(coro.send('apple'))
next(coro)
print(coro.send('banana'))
next(coro)
print(coro.throw(KeyError))
next(coro)
print(coro.send('dog'))
next(coro)
print(coro.send('d'))

输出:

default
default
default
default
dog
© www.soinside.com 2019 - 2024. All rights reserved.