用python编写多个try和except

2024-03-29 07:57:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道用python编写try..except语句的最优雅的方式是什么。假设我有这个代码:

with open(sys.argv[1]) as f:
    for line in f:
        try:
            do_1(line)
        except:
            pass
        try:
            do_2(line)
        except:
            pass
        try:
            do_3(line)
        except:
            pass
        ...
        ...

写这个最好的方法是什么?我的行动是循序渐进的。但是,如果do_1失败,我仍然想执行do_2。如果它们都在一个try..except块中,那么如果do_1失败,我将永远无法到达do_2。这是正确的方法吗,还是可以为所有d0_i操作使用一个except?在


Tags: 方法代码foraswithsys方式line
3条回答

我将列出您的try/except语句的通用代码。比如:

def run_safely(f, *args):
    try:
        f(*args)
    except SpecificException:
        # handle appropriately here
        pass

with open(sys.argv[1]) as f:
   for line in f:
       run_safely(do_1, line)
       run_safely(do_2, line)
       run_safely(do_3, line)

实际上,您需要每个do_<Step>函数在前一个函数的finally块内运行,如下所示:

try:
    do_1(line)
    except:
        # Handle failure
        pass
    finally:
        # Run regardless
        try:
            do_2(line)
        except:
            # Handle failure
        finally:
            # Run regardless
            try:
                do_3(line)
                ...

这将通过finally块将函数链接在一起。请注意,在任何步骤中发生异常时,将在开始下一步之前处理该异常,无论是否生成异常,下一步都保证运行。在


由于您的函数都具有相同的形状(采用相同数量和类型的参数),您可以将此模式抽象为一个函数,如下面的tryChain

^{pr2}$

注意,在本例中,只有最后一个异常被抛出回调用者;其他异常被隐藏。(您也可以在tryChain内处理异常,在那里插入一个except块;或者,您可以为每个步骤传递一个错误处理程序;或者从异常类型到适当的处理程序的映射,如果它们都不匹配,则重新抛出错误-但此时,您实际上是在重新设计异常处理。)

把它写成一个循环就足够简单了:

for action in [do_1, do_2, do_3, ...]:
    try:
        action(line)
    except AppropriateExceptionType:
        pass

相关问题 更多 >