甜萝 发表于 2022-9-16 19:28

finally代码片段的执行

本帖最后由 paypojie 于 2022-9-16 23:16 编辑

                                                                                                            不知道起啥标题 想不出

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

vscode运行结果



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

示例2
def function():
    print(1 / 0)
    return 10
try:
    function()
except Exception as err:
    print(err)
finally:
    print('你好')

截图:


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

例三:
def function():
    return 10
    # print(1 / 0)
try:
    function()
except Exception as err:
    print(err)
finally:
    print('你好')


截图:


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

例四:
def function():
    try:
      print(1 / 1)
      return 1
    except Exception as err:
      print(err)
    finally:
      print('你好')

f = function()
print(f)



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

例五:
def function():
    try:
      print(1 / 1)
      return 1
    except Exception as err:
      print(err)
    finally:
      print('你好')
      return 2

f = function()
print(f)

截图:


这一次 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语句才能输出返回值 感觉好绕 哈哈


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

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确实很好 蟹蟹

{:301_971:}{:301_999:}{:301_998:}{:301_997:}{:301_972:}
页: [1]
查看完整版本: finally代码片段的执行