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语句返回.


  • 相关阅读:
    linux文件系统
    用户态和内核态
    nginx优化
    平滑升级nginx
    网络--基本概念
    haproxy
    awk
    kvm
    lvs
    自定义不等高cell—storyBoard或xib自定义不等高cell
  • 原文地址:https://www.cnblogs.com/fanlei5458/p/9235488.html
Copyright © 2011-2022 走看看