关于异常捕获的小知识点——try,except写在函数内外
关于异常捕获的小知识点——try,except写在函数内外
本篇主要讲解一下,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里,匹配异常类型后输出了未知错误……
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)