- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我不确定下面这段代码到底发生了什么:
def coroutine():
lst = []
try:
while True:
item = (yield lst)
if item == 3:
raise ValueError
print('append {}'.format(item))
lst.append(item)
except GeneratorExit:
print('GeneratorExit')
crt = coroutine()
next(crt)
print(crt.send(1))
print(crt.send(2))
try:
print(crt.send(3))
except ValueError:
pass
print(crt.send(4))
这个输出:
append 1
[1]
append 2
[1, 2]
Traceback (most recent call last):
File "D:\Documents and Settings\Brecht\Desktop\crt.py", line 25, in <module>
print(crt.send(4))
StopIteration
当使用调试器单步执行代码时,在 raise ValueError
上,执行跳转到 except GeneratorExit:
,但不执行此 except 子句的主体('GeneratorExit ' 未打印)。为什么不呢?
除此之外,我不认为我可以在它抛出异常后以任何方式恢复协程?有什么特别的理由不允许这样做吗?这至少在我的特定用例中会有用:)
最佳答案
当您抛出异常时,代码流总是中断。一旦在其中抛出异常,就无法恢复中断的生成器。
来自 PEP 342 (Coroutines via Enhanced Generators) :
As with the
next()
method, thesend()
method returns the next value yielded by the generator-iterator, or raisesStopIteration
if the generator exits normally, or has already exited. If the generator raises an uncaught exception, it is propagated tosend()
's caller.
至于调试器跳转到except
行:您刚刚抛出一个异常,解释器正在测试异常是否被该行捕获。因为它只会捕获 GeneratorExit
,所以生成器会在该点退出。
关于python - 当协程引发异常时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15372018/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!