【问题标题】:How to continue with next line in a Python's try block?如何继续 Python 的 try 块中的下一行?
【发布时间】:2011-10-31 11:08:38
【问题描述】:

例如

try:
    foo()
    bar()
except: 
    pass

当 foo 函数抛出异常时,如何跳到下一行(bar)并执行?

【问题讨论】:

    标签: python exception


    【解决方案1】:

    bar() 移出try 块:

    try:
        foo()
    except: 
        pass
    bar()
    

    顺便说一句,请注意包罗万象的except 子句。倾向于选择性地捕获您知道可以处理/忽略的异常。

    【讨论】:

    • 更好的bare except 形式是except Exception:,因为它不会捕获KeyboardInterrupt 或SystemExit 之类的东西。所以如果这被困在一个紧密的循环中,你仍然可以用 ^C 打破。
    【解决方案2】:

    如果对bar 的调用位于try 块内,则无法完成。您必须将调用放在 try-except 块之外,或者使用 else:

    try:
        foo()
    except:
        pass
    else:
        bar()
    

    如果bar 也可能引发异常,您必须为bar 使用单独的try 块。

    【讨论】:

      【解决方案3】:

      如果您只有两个函数 foo() bar(),请检查其他解决方案。如果您需要运行很多行,请尝试以下示例:

      def foo():
          raise Exception('foo_message')
      def bar():
          print'bar is ok'
      def foobar():
          raise  Exception('foobar_message')
      
      functions_to_run = [
           foo,
           bar,
           foobar,
      ]
      
      for f in functions_to_run:
          try:
              f()
          except Exception as e:
              print '[Warning] in [{}]: [{}]'.format(f.__name__,e)
      

      结果:

      [Warning] in [foo]: [foo_message]
      bar is ok
      [Warning] in [foobar]: [foobar_message]
      

      【讨论】:

        【解决方案4】:

        这不是使用 try/except 块的预期方式。如果bar() 应该被执行,即使foo() 失败,你应该把每个都放在它自己的try/except 块中:

        try:
          foo()
        except:
          pass # or whatever
        
        try:
          bar()
        except:
          pass # or whatever
        

        【讨论】:

          【解决方案5】:

          如果您希望两个函数的异常由相同的 except 子句处理,则使用内部 try/finally 块:

          try:
              try:
                  foo()
              finally:
                  bar()
          except Exception:
              print 'error'
          

          如果foo()有异常,先执行bar(),再执行except子句。

          但是,将最少量的代码放在 try 块中通常是一种很好的做法,因此最好为每个函数使用单独的异常处理程序。

          【讨论】:

            猜你喜欢
            • 2014-07-15
            • 2013-11-26
            • 2019-06-19
            • 2012-06-04
            • 1970-01-01
            • 2014-04-17
            • 2014-05-16
            • 1970-01-01
            • 2020-02-28
            相关资源
            最近更新 更多