了解Python中的异常处理

时间:2014-12-10 01:12:00

标签: python function exception exception-handling

我有两个关于异常处理的问题。

Q1)我稍微不确定何时在else内的操作将在异常处理中执行。我不确定何时执行else块,这在下面的代码中没有出现:

def attempt_float(SecPrice,diffprice):
    try:
        return float(SecPrice)
    except:
        return diffprice
    else: 
        print "Did we succeed?"

print attempt_float('7','3') 

Q2)当我运行以下代码时:

def attempt_float(SecPrice,diffprice):
    try:
        return float(SecPrice)
    except:
        return diffprice
    else: 
        print "Did we succeed?"
    finally:
        print "Yasdsdsa"

print attempt_float('7','3')

我不清楚为什么输出是:

Yasdsdsa
7.0

2 个答案:

答案 0 :(得分:2)

在第一种情况下,您将在try内返回,因此您永远不会点击else语句。

在第二个中,无论finally如何退出,都会执行try。来自python docs

在离开try语句之前总是执行finally子句,无论是否发生了异常。 (...)当通过break,continue或return语句留下try语句的任何其他子句时,finally子句也在“在出路上”执行。

以下是执行顺序的一个很好的例子:

>>> def divide(x, y):
...     try:
...         result = x / y
...     except ZeroDivisionError:
...         print "division by zero!"
...     else:
...         print "result is", result
...     finally:
...         print "executing finally clause"
...
>>> divide(2, 1)
result is 2
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause

请务必阅读有关例外的文档!

答案 1 :(得分:2)

当Python在函数内遇到return语句时,它会立即从函数返回(退出)。这意味着当你这样做时:

try:
    return float(SecPrice)
...
else: 
    print "Did we succeed?"

"Did we succeed?"将永远不会被打印,因为您在try:块中返回,从而跳过了else:块的执行。


您的第二个代码段不同,因为您使用了finally:块。 finally:块内的代码总是执行,无论是否引发异常,从函数返回等等。这是为了确保任何重要的清理代码(即释放)资源)总是被执行而不是被意外跳过。

您可以在文档here中了解此行为:

  

return通过tryfinally语句中的控制权移出时   ,finally子句在真正离开之前执行   功能

以及here

  

return中执行breakcontinuetry语句时   try...finally语句的套件,finally子句也是   在“出路途中”执行。


至于为什么输出是:

Yasdsdsa
7.0

而不是:

7.0
Yasdsdsa

答案是print "Yasdsdsa"行在finally:块中执行,然后才能打印7.0attempt_float的返回值)。简而言之,Python的执行路径是:

  1. 返回float(SecPrice)
  2. 运行finally:阻止。
  3. 使用print attempt_float('7','3')行恢复正常执行并打印7.0