Python的finally语句详解

本文探讨了finally语句在Python中的执行机制,尤其是在文件操作、数据库连接和锁管理中的应用。同时,通过例子对比finally与with语句,强调了with语句在简化资源管理上的优势。
摘要由CSDN通过智能技术生成

finally语句

finally 语句块中的代码,无论是否出现异常,均会执行

有一些情况需要捆绑两个行为:
1.文件的打开和关闭(不关闭的话会导致后台占用,其他软件无法进行编辑)
2.数据库的连接和断开
3.锁的获取和释放

def read_file(filename):
    try:
        with open(filename) as f:
        #with的意思是在try之前就执行完毕这段代码,也就是默认`打开文件`这个操作是没有异常的
            return f.read()
    except FileNotFoundError:
        return "File not found"
    finally:
        f.close()

无论上述的代码执行过程中是否出现异常,都会执行finally语句块中的代码

思考:finally是在return之前执行还是在return之后执行?

def test():
    f = [1, 2]
    sum = 0
    try:
        for i in f:
            sum += int(i)
            return sum
    except Exception:
        pass
    finally:
        sum = 10
        print(sum)
print(test())
#输出:10
      1   #这里sum没有变为10是因为int类型是值传递,不会改变原有的sum

finally是在return之前执行的
实际上在return sum之前,sum会被赋值给一个临时变量,return的其实是那个临时变量,由于sum是值传递所以sum的值没有被finally影响

def test():
    f = [1, 2]
    s = sum(f)
    try:

        return f
    except Exception:
        pass
    finally:
        f.append(3)
        print(s)
print(test())
#输出:3
      [1,2,3]   #f里面添加了一个元素3,并且return回的是执行finally之后的f,因为列表list是引用传递

但是finally会出现问题:以锁为例

import threading

def test():
    try:
        #此处进行打开文件等一系列操作
        lock = threading.Lock()
        lock.acquire()  #获取锁
        #此处是多行处理逻辑
    except Exception:
        pass
    finally:
        lock.release()
        pass

如果,在打开文件等一系列操作的时候就已经异常了,那try里面声明的lock变量就会不存在,进而导致finally里的lock.release()报错

可以解决:但会很丑陋

import threading

def test():
    try:
        #此处进行打开文件等一系列操作
        lock = threading.Lock()
        lock.acquire()  #获取锁
        try:
            #此处是多行处理逻辑
        expect Expection:
            pass
        finally:
            lock.release()
    except Exception:
        pass
    finally:
        pass

with语句

用with可以替代try expect finally

with open(filename) as f:
    #此处是多行处理逻辑

with语句的好处就是可以不用管close的操作,因为with语句会自动帮你关闭

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值