来源: kqdsb公众号: Python与数据分析链接: https://MP.weixin.QQ.com/s/6 jbvyl1yovbryvqcdc 67 SG
无论try语句是否抛出异常,finally语句都将执行。 看看下面的例子。 try:
f=open('/tmp/output ',' w ' ) )。
f .写入(hello ) ) )。
#raiseexception(somethingwrong ) )。
finally:
打印(关闭文件) )。
f.close ) )无论在使用try编写文件时是否存在异常,finally都将执行关闭文件的操作。 由于finally的这一特性,finally经常被用于清洁工作。
下面的示例查看deffunc1(: )
try:
返回1
finally:
返回2
deffunc2(: )
try:
raise ValueError (
except:
返回1
finally:
返回3
打印(func1) )
print(func2) (在本例中为func1) )和func2) )返回什么? 答案是func1) )返回2,func2) )返回3。 为什么会这样呢? 首先,让我们来看看Python官网上对finally的说明。 afinallyclauseisalwaysexecutedbeforeleavingthetrystatement, whetheranexceptionhasoccurredornot.whenanexceptionhasoccurredinthetryclauseandhasnotbeenhandledbyanexceptclause (ur red in a exxcured ) itis re-raisedafterthefinallyclausehasbeenexecuted.thefinallyclauseisalsoexecuted " on the way out " whenanyotherclauseofthetred
重点部分用粗体字表示。 翻译为中文时,try块包含break、continue或return语句。 在离开try块之前,还会执行finally语句。
因此,在上面的示例中,func1) )在try块return之前执行finally语句,忽略try return,最终返回的值是finally return的值。 func2) )中,向try块抛出异常,由except捕获,在except块返回之前执行finally语句,忽略except返回,最终返回的值为finally返回
在上例中输入print语句可以更清楚地看到进程def func1) ) :
try:
打印' in func 1try : try statement,will return 1'
返回1
finally:
print ' in func1finally : try statement,will return 2'
返回2
deffunc2(: )
try:
print ' in func2try : raise error '
raise ValueError (
except:
print ' in func2except : caught error,will return 1!'
返回1
finally:
print ' in func2finally 3360 will return3'
返回3
打印功能1 () )。
打印函数2 ) )上的代码输出in func1 try: try statement,will return 1
in func1finally : try statement,will return 2
2
in func2 try: raise error
in func2 except: caught error,will return 1!
in func2 finally: will return 3
3我们对上面的func2进行了一些修改,如下def func2() :
try:
print ' in func2try : raise error '
raise ValueError (
except IndexError:
print ' in func2except : caught error,will return 1!'
返回1
finally:
print ' in func2finally 3360 will return3'
返回3
打印函数2 ) )输出以下in func2 try: raise error
in func2 finally: will return 3
3try抛出的异常属于ValueError类型,而except将其定位为索引error类型,不会捕获try抛出的异常,因此不会执行except语句,但不知道是否捕获到异常
这里还可以看到别的问题。 在try中抛出的异常不会被捕获,本来应该在finally运行完成后再次抛出,但在finally中执行了return,异常丢失。
可以看到,在finally中使用return会遇到很多问题。 在实际的APP应用程序中,finally不建议使用返回返回。
多读