- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下 mcve :
import logging
class MyGenIt(object):
def __init__(self, name, content):
self.name = name
self.content = content
def __iter__(self):
with self:
for o in self.content:
yield o
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
if exc_type:
logging.error("Aborted %s", self,
exc_info=(exc_type, exc_value, traceback))
这里是示例使用:
for x in MyGenIt("foo",range(10)):
if x == 5:
raise ValueError("got 5")
我希望 logging.error
报告 ValueError
,但它报告 GeneratorExit
:
ERROR:root:Aborted <__main__.MyGenIt object at 0x10ca8e350>
Traceback (most recent call last):
File "<stdin>", line 8, in __iter__
GeneratorExit
当我在 __iter__
中捕获 GeneratorExit
时:
def __iter__(self):
with self:
try:
for o in self.content:
yield o
except GeneratorExit:
return
没有记录(当然)因为 __exit__
是用 exc_type=None
调用的。
__exit__
中看到的是 GeneratorExit
而不是 ValueError
?__exit__
中的 ValueError
?最佳答案
请注意,您可以“将上下文管理器带出”生成器,只需更改 3 行即可获得:
import logging
class MyGenIt(object):
def __init__(self, name, content):
self.name = name
self.content = content
def __iter__(self):
for o in self.content:
yield o
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
if exc_type:
logging.error("Aborted %s", self,
exc_info=(exc_type, exc_value, traceback))
with MyGenIt("foo", range(10)) as gen:
for x in gen:
if x == 5:
raise ValueError("got 5")
上下文管理器也可以充当迭代器——并且会捕获调用方代码异常,例如您的 ValueError。
关于python - 我如何使用 GeneratorExit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50691616/
例如, In [33]: def gener(): ...: try: ...: print('hi') ...: yield 1 ...:
我有以下 mcve : import logging class MyGenIt(object): def __init__(self, name, content): sel
我不清楚在 while 循环中捕获 GeneratorExit 的行为,这是我的代码: # python Python 2.6.6 (r266:84292, Sep 4 2013, 07:46:00
我写了一个关于 Python 生成器的测试程序。但是我得到了一个意想不到的错误。我不知道如何解释。让我向您展示代码: def countdown(n): logging.debug("Coun
def receiver(): print("Ready to receive") # try: while True: n = (yield) p
我查看了内置 python 异常的层次结构,我注意到 StopIteration 和 GeneratorExit 有不同的基类: BaseException +-- SystemExit +--
感谢您提出我的问题。我试着把我的问题说清楚,但如果因为我的英语还有不清楚的地方,请告诉我。 我正在研究 Python 协同程序,并且读到在生成器上调用 close() 方法类似于将 Generator
我是一名优秀的程序员,十分优秀!