关于异常处理,我有两个问题。
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
当Python在函数内部遇到返回语句时,它将立即从函数返回(退出)。这意味着您执行以下操作:
try:
return float(SecPrice)
...
else:
print "Did we succeed?"
"Did we succeed?"
因为您返回了该try:
块,所以将永远不会打印,从而跳过该else:
块的执行。
但是,第二个代码段是不同的,因为您使用了一个finally:
块。无论是否引发异常,从函数返回等,始终执行finally:
块内的代码。这是为了确保始终执行并且不意外跳过任何重要的清除代码(即释放资源)。
您可以在以下两个文档中了解有关此行为的信息:
当
return
将控制从try
带有finally
子句的语句传递出去时,该finally
子句在真正离开函数之前执行。
以及这里:
当
return
,break
或者continue
声明在执行try
一套一的try...finally
声明中,finally
还执行条款“的出路。”
至于为什么输出是:
Yasdsdsa
7.0
并不是:
7.0
Yasdsdsa
答案是该print "Yasdsdsa"
行在finally:
Python能够打印之前的代码块中执行7.0
(返回值attempt_float
)。简而言之,Python的执行路径为:
float(SecPrice)
。finally:
块。print attempt_float('7','3')
行恢复正常执行并打印7.0
。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句