zoukankan      html  css  js  c++  java
  • 大多数人不知道的try..except...finally中的陷阱!!

    异常丢失:

    请先看看下面的代码:

    def fun():
        try:
            print('try--start')
            a = 1/0
        except ValueError as ret:
            print(ret)
        finally:
            return 'finally'
    
    
    print(fun())

    执行的结果:

    try--start
    finally

    按理说a = 1/0 应该会抛出ZeroDivisionError异常,但执行的结果却没有任何异常,下面我们来分析一下出现这种情况的原因

    当try中发生了异常,首先会执行except,解释器会看看except后面有没有对应的异常声明,如果有就处理,如果except中没有对应的处理异常就会被临时保存起来,然后去执行finally语句,但如果finally中产生了新的异常或者执行了return或者break语句,那么临时保存的异常将会被丢失,从而导致了ZeroDivisionError并没有被真正的抛出来.

    try中return丢失

    请看如下代码:

    def fun():
        try:
            print('try--start')
            return 'try return'
        except:
            pass
        finally:
            return 'finally'
    
    
    print(fun())

    执行的结果是

    try--start
    finally
    

    为什么没有返回try return呢?下面我们就来分析一下原因

    finally有一个特性,那就是无论如何,finally中的代码都将被执行,那么当执行到try中return的时候函数fun将被结束返回,这个时候由于finally的特性,try中的return 'try return' 经暂时被挂起,当执行完finally中的语句之后再返回执行,可finally中却执行了另一个return,导致了函数直接结束了,此时try中的finally就被丢失了,

    所有在我们的实际开发中我们应尽量避免在finally使用return语句返回.


  • 相关阅读:
    DoNet:浅淡对delegate的理解
    纹理学习总结
    Vue引发的getter和setter
    JS——判断一个对象是否为空
    使用vue-axios请求geoJson数据报错的问题
    在vue-cli项目中使用echarts
    Vue中的$set的使用
    史上最全的开发和设计资源大全(转--------来源:伯乐在线)
    IOS safari浏览器登陆时Cookie无法保存的问题
    JS中const、var 和let的区别
  • 原文地址:https://www.cnblogs.com/fanlei5458/p/9235488.html
Copyright © 2011-2022 走看看