当我必须捕获生成器中可能发生的异常时,如何使 try block 尽可能小?
典型的情况是这样的:
for i in g():
process(i)
如果 g()
可以引发我需要捕获的异常,第一种方法是这样的:
try:
for i in g():
process(i)
except SomeException as e:
pass # handle exception ...
但是如果它发生在 process(i)
中,这也会捕获 SomeException
(这是我不想要的)。
是否有处理这种情况的标准方法?某种模式?
我正在寻找的是这样的:
try:
for i in g():
except SomeException as e:
pass # handle exception ...
process(i)
(但这当然是句法上的废话。)
最佳答案
您可以转换发生在内部 block 中的异常:
class InnerException(Exception):
pass
try:
for i in g():
try:
process(i)
except Exception as ex:
raise InnerException(ex)
except InnerException as ex:
raise ex.args[0]
except SomeException as e:
pass # handle exception ...
另一种选择是编写一个包装g
的本地生成器:
def safe_g():
try:
for i in g():
yield i
except SomeException as e:
pass # handle exception ...
for i in safe_g():
process(i)
关于python - 在生成器中捕获异常时保持 try block 较小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13530290/