【发布时间】:2014-06-17 18:41:50
【问题描述】:
我很难找到“pythonic”的方法来做到这一点: 我需要用相同的 try-except 模式捕获不同的代码块。 要捕获的块彼此不同。 目前,我在代码的几个点重复相同的 try-except 模式,并带有一长串异常。
try:
block to catch
except E1, e:
log and do something
except E2, e:
log and do something
...
except Exception, e:
log and do something
使用 with 语句 和 上下文管理器 装饰器可以解决这个问题:
from contextlib import contextmanager
@contextmanager
def error_handler():
try:
yield
except E1, e:
log and do something
...
except Exception, e:
log and do something
...
with error_handler():
block to catch
...
但是,如果我需要知道块中是否存在异常,会发生什么?即是否有任何替代方法可以为 try-except-else 执行类似于前面的 with block 的操作?
一个用例示例:
for var in vars:
try:
block to catch
except E1, e:
log and do something
# continue to the next loop iteration
except E2, e:
log and do something
# continue to the next loop iteration
...
except Exception, e:
log and do something
# continue to the next loop iteration
else:
do something else
我可以用 Python 的方式做类似的事情来避免一次又一次地重复相同的 try-except 模式吗?
【问题讨论】:
-
是的,即“pythonic”,异常处理遵循模式try-{exceptions...}-else-finally。
-
请贴出真实代码的链接,根据抽象样本很难给出准确的建议
标签: python error-handling refactoring try-except contextmanager