try,except,finally的用法

 

 

try,except,finally

try...except形式:指定一个或多个异常处理器(异常子句).。

当在try子句中没有异常发生时,,异常处理器将不被执行.

当在try子句中有异常发生时,首先会执行except搜索异常处理器,它会按顺序搜索直到第一个匹配的处理器找到为止.。

如果在except后面找到对应的异常声明,就会处理。

如果没有找到,异常就会被临时保存起来,然后去执行finally语句,但如果finally中产生了新的异常或者执行了return或者break语句,那么临时保存的异常将会被丢失,如果finally没有上面的情况,最后就会抛出保存的异常。

注意:一般我们会将一个没有指定异常的except语句, 它必须放在最后, 它会匹配任何异常并处理。

 

try...finally形:式指定一个清除处理器. 在执行try语句块没有异常发生时, finally子句被执行.在异常引发时, 该异常就被临时保存起来, finally也被执行, 然后暂存的异常被重新引发.

如果执行finally子句时引发了另一个异常或执行了return或break语句, 就会抛弃保存的异常,在finally子句中的continue语句是非法的(这么做的原因是当前实现的原因 ---- 这个限制可能也会保留下去)在执行finally子句时异常信息是无效的.  

 

简单总结

1.当执行try...except之间的语句序列没有发生异常时,则忽略异常处理部分(except)的语句。

2、Except括起来的语句,则只有在产生异常的情况下会被执行,其他情况一概不执行的。 

3、Finally括起来的语句是铁定会被执行的,无论是否有异常产生;

 

面试题1

def func():
    try:
        return 123
    finally:
        return 321
print(func())#结果:321
 
def func():
    try:
        return 123
    finally:
        print(321)
print(func())#结果321 123

finally有一个特性,那就是无论如何,finally中的代码都将被执行,那么当执行到try中return的时候函数fun将被结束返回,这个时候由于finally的特性,try中的return 'try return' 经暂时被挂起,当执行完finally中的语句之后再返回执行,可finally中却执行了另一个return,导致了函数直接结束了,此时try中的finally就被丢失了。所有在我们的实际开发中我们应尽量避免在finally使用return语句返回。

 

面试题2

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

如果在except中没有捕获异常,异常会被保存起来,当finally子句时引发了另一个异常或执行了return或break语句,就会抛弃保存的异常。

 

posted @ 2019-10-10 16:18  -零  阅读(8145)  评论(0编辑  收藏  举报