我有两个关于异常处理的问题。
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
答案 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
通过try
将finally
语句中的控制权移出时 ,finally
子句在真正离开之前执行 功能
以及here:
在
return
中执行break
,continue
或try
语句时try...finally
语句的套件,finally
子句也是 在“出路途中”执行。
至于为什么输出是:
Yasdsdsa
7.0
而不是:
7.0
Yasdsdsa
答案是print "Yasdsdsa"
行在finally:
块中执行,然后才能打印7.0
(attempt_float
的返回值)。简而言之,Python的执行路径是:
float(SecPrice)
。finally:
阻止。print attempt_float('7','3')
行恢复正常执行并打印7.0
。