关于异常捕获的小知识点——try,except写在函数内外

  • Post author:
  • Post category:其他


本篇主要讲解一下,try,except和函数结合使用时候的两种情况



1 try,excpt在函数内

众所周知,try,except语句用于捕获异常,增强程序健壮性和稳定性,因为将异常捕获到之后下面的代码还是可以正常执行的,比程序抛出错误好太多。我们来看下面一段代码:

def demo1():
    try:
        print('我正在执行demo1函数')
        raise Exception('查看报错是否返回到函数调用处')
        # int(input('请输入一个整数: '))
    except Exception as result:
        print('我进来了except里')
        # raise result


def demo2():
    return demo1()


try:
    print(demo2())
except ValueError:
    print('请输入正确的整数')
except Exception as result:
    print(f'未知错误{result}')

在这里插入图片描述

打断点之后可以看到代码执行顺序:1 11 15 16 12 输出第一二句 12 16 输出None。可以看出来,代码执行了demo1中的print(‘我正在执行demo1函数’),然后执行了 raise Exception(‘查看报错是否返回到函数调用处’),因为主动抛出了异常,所以自然而然进入到了第6句的异常捕获中,接着执行了第七句。之后回到了函数调用处第12句,此时其实demo1执行完什么都没有return ,所以第12行其实就是return None.然后再次执行demo2函数,就是又在第12行停留一下,再返回到函数调用处第16行,因为demo2中写的return None,所以最终输出的就是demo2执行之后的结果,None。



这里需要注意的是


(1)如果将try, except写在函数内,就要注意,无论是try,还是except里都要写raise

。否则一旦出错,函数既没有return什么东西,也没有返回出现的错误,函数调用处接收到的就是None。相当于函数执行了一趟什么都没干。既没返回有用的东西,报错信息也没有返回。


(2)如果将try, except写在函数内,那么执行try中程序报错或者使用raise主动抛出异常,是可以正常进入到except Exception as error里被捕获到的。那么有些人可能会想,那不是废话嘛,try里报错肯定到了except里了啊,但是如果try,except在函数外部,那就不会到except里了。而是回到函数调用处。


在这里插入图片描述

可以看到,当把第8行放开,那么函数执行顺序就是1。11 15。16 12 输出语句之后 12停留一下 16 17。19。20.。就是当执行完demo1之后,demo1把报错返回给了调用函数的地方,也就是说demo2里其实是这样的:return ‘查看报错信息是否返回到了函数调用处’ ,就是demo1抛出来那个result传递给了demo2.然后demo2执行完回到函数调用处第16行,try里出错了,就到了except里,第一个except错误类型不匹配,所以到了第二个except,所以最终将demo1中的报错信息传递给了20行,打印了报错信息。



2 try ,except在函数外

try:
    def demo1():
        print('我正在执行demo1函数')
        raise Exception('查看报错是否返回到函数调用处')
        # int(input('请输入一个整数: '))
except Exception as result:
    print('我进来了except里')
    raise result


def demo2():
    return demo1()


try:
    print(demo2())
except ValueError:
    print('请输入正确的整数')
except Exception as result:
    print(f'未知错误{result}')

在这里插入图片描述


代码执行完第9行直接跳转到了17行,因为当try在函数外部写的时候,异常具有传递性,会直接返回到调用函数处,而不会走except.


然后又返回到了初次调用demo2的地方第21行。因为执行21行的时候会有报错返回,(也是因为有报错所以没有什么都没有返回,返回None说明函数还没报错,什么返回值也没有,就是返回了None。如果连None都没返回说明报错了)所以走到了except里,匹配异常类型后输出了未知错误……



版权声明:本文为simpleness_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。