python - 在生成器中捕获异常时保持 try block 较小

标签 python exception generator except

当我必须捕获生成器中可能发生的异常时,如何使 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/

相关文章:

javascript - 类中可以有生成器 setter/getter 吗?

python - 如何编写注册账户测试用例?

python - 与Pyo在Python中一起玩2+正弦波

java - 如何在 boolean 方法中抛出三个异常?

android - 即使处理了异常,Xamarin 应用程序也会崩溃

generator - 这是素数生成器 pythonic

python - 类内的 Nose 测试生成器

Python:配对匹配元素

python 3 : Integer not repeated

c++ - 子类化 boost 异常