吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 866|回复: 2
收起左侧

[学习记录] finally代码片段的执行

[复制链接]
甜萝 发表于 2022-9-16 19:28
本帖最后由 paypojie 于 2022-9-16 23:16 编辑

                                                                                                              不知道起啥标题 想不出

示例:
[Python] 纯文本查看 复制代码
def function():
    print(1 / 0)
try:
    function()
except Exception as err:
    print(err)
finally:
    print('你好')

代码注解: 定义一个函数 里面用return返回零除以一的值  try语句下 调用function函数
except 语句表示 捕捉错误类型 并将其保存到err变量中 然后打印错误类型  finally语句意思是无论前面报不报错 语句都会执行

vscode运行结果
  
QQ截图20220916141730.png

发现调用函数时有错误 从错误原因我们可以知道 零不能是除数 执行顺序是正常的 try下面的语句出错了 然后立马执行except下的语句 最后执行finally下的语句

示例2
[Python] 纯文本查看 复制代码
def function():
    print(1 / 0)
    return 10
try:
    function()
except Exception as err:
    print(err)
finally:
    print('你好')


截图:
uTools_1663309457563.png

右边的代码增加了一行   return 10  但是执行结果却没有变化 这是怎么回事呢 因为try语句下如果出错 立马执行except下的语句

例三:
[Python] 纯文本查看 复制代码
def function():
    return 10
    # print(1 / 0)
try:
    function()
except Exception as err:
    print(err)
finally:
    print('你好')


截图:

QQ截图20220916183145.png

try...except...finally语句中 try语句或者except中含有return语句 但是因为有finally语句 所以会先执行finally语句 return语句在这里执行了 但是没有被打印

例四:
[Python] 纯文本查看 复制代码
def function():
    try:
        print(1 / 1)
        return 1
    except Exception as err:
        print(err)
    finally:
        print('你好')

f = function()
print(f)


QQ截图20220916185735.png


在这里 我们将函数赋值给了变量 然后打印变量 发现try语句下的return没有立刻执行 而是先执行完finally下的语句 然后再执行return语句

例五:
[Python] 纯文本查看 复制代码
def function():
    try:
        print(1 / 1)
        return 1
    except Exception as err:
        print(err)
    finally:
        print('你好')
        return 2

f = function()
print(f)


截图:
QQ截图20220916190409.png

这一次 return语句返回了2 因为try下的return1 被 finally的return给覆盖了

感觉自己都要被绕晕了 但是编程太有魅力了 嘿嘿

总结一下 在 try...except语句下 try下的语句没出错的话 就会执行把try下的语句给执行完 不会执行except下的语句 如果出错 那么立即就跳转到except语句 执行except下的语句

try...except...finally语句下 try下的语句没出错 就先把try下的语句执行完 然后执行finally语句 如果try下的语句出错 那就立马执行except下的语句 最后再执行finally下的语句 finally语句是无论如何都会执行的

上面这两种情况是没有含有return语句的 什么的情况好理解 因为不含有return语句

下面的情况:

假如 在try...except...finally语句中 try或者except含有return语句 那么return语句会缓冲 会等待finally下的语句执行完 然后再执行return语句 如果同时在finally语句中也含有return语句 那么finally下的语句会把finally什么代码片段中的return给覆盖

要注意 (在下面的情况:) return会返回值 但是要用print语句才能输出返回值 感觉好绕 哈哈



喜欢评论 有意思的评论会晚上锻炼完 回来再看及回复 加油 共勉!

免费评分

参与人数 1吾爱币 +1 收起 理由
13507520538 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

4028574 发表于 2022-9-16 20:34
finally 这个东西 主要是做收尾工作用得   
正常开发  基本都不会再finally中做返回    因为你正常得程序 无非就两个结果 一个是正确执行后得结果  一个是异常产生后得结果 或者直接报异常  你再finally当中返回  就等于直接覆盖了上述得不管是正确返回还是错误返回得结果 这就没有任何意义了
但是 finally 这个东西很有用 比如你再做线程加锁得时候  然后这个线程出错 或者处理完成 需要释放这个锁 最好得方式就是再finally当中释放
但是python这个语言 finally 其实用得还真不多   其他开发语言得 用的还是蛮多得
 楼主| 甜萝 发表于 2022-9-16 23:12
本帖最后由 paypojie 于 2022-9-16 23:14 编辑
4028574 发表于 2022-9-16 20:34
finally 这个东西 主要是做收尾工作用得   
正常开发  基本都不会再finally中做返回    因为你正常得程序  ...

我不知道这些 正常情况 在finally中用return确实少见 线程加锁 用finally确实很好 蟹蟹

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-12 10:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表