理解python尝试catch else finally子句行为

时间:2013-08-01 00:23:21

标签: python

Python 2.6.5(r265:79063,2012年10月1日,22:07:21)

我有这个:

def f():
    try:
        print "a"
        return
    except:
        print "b"
    else:
        print "c"
    finally:
        print "d"
f()

这给出了:

a
d 

而不是预期的

a 
c 
d 

如果我评论退货,那么我会得到

a 
c 
d 

我如何记住python中的这种行为?

6 个答案:

答案 0 :(得分:7)

如有疑问,请咨询the docs

  

如果控制流出else子句的末尾,则执行可选的try子句

     

目前,除了例外情况或执行returncontinuebreak声明外,控制“流出结尾”。

由于您return阻止了tryelse将不会被执行。

答案 1 :(得分:2)

除了VM的灾难性故障外,

finally阻止总是发生。这是finally

合同的一部分

你可以记住这是finally所做的事情。不要被其他控制结构混淆,例如if / elif / else / while / for / ternary / what语句,因为它们没有这个合同。 finally确实如此。

答案 2 :(得分:1)

连接到try块的else块在异常机制方面并不特殊 - 它类似于在try块之后将代码放在函数体中。唯一的功能是能够在try块和finally块之间执行“普通”代码。但这确实意味着如果函数在到达else块之前返回,它将永远不会执行。

答案 3 :(得分:1)

看看Python文档!

您可以将此用于异常处理,为此页面添加书签!

http://docs.python.org/2/tutorial/errors.html

答案 4 :(得分:1)

  1. 您输入try块。
  2. print "a"
  3. 您遇到return语句,函数返回。
  4. 由于finally块总是执行,但finally块中的所有内容都在函数实际结束执行之前发生。
  5. 仅在else块已完成且未发生异常时输入try块。因为您在return块中try编辑了,但即使没有发生异常,也没有完成。就好像你根本没有try / else块一样,并且你把所有代码放在同一级别的缩进上。

    try / else更多是为了代码组织而存在的;除非添加finally块,否则与使用无else块完全相同。以下是功能相同的:

    try:
        print "foo"
    except:
        print "woops"
    else:
        print "bar"
    
    try:
        print "foo"
    except:
        print "woops"
    print "bar"
    

    但是,如果您要使用else,则必须使用finally。这没有任何意义:

    try:
        print "foo"
    except:
        print "woops"
    print "bar"
    finally:
        print "done"
    

    在这种情况下finally应该引用什么?如果您打算使用else,则必须使用finally,除非您不打算在try阻止之后但finally之前发生任何事情。

答案 5 :(得分:0)

return ... break声明的continue套件中执行trytryfinally声明时{ {1}}子句也在“出路时”执行。finally语句在continue子句中是非法的。 (原因是当前实施存在问题 - 将来可能会解除此限制。)

这实际上来自文档。