44-异常(1)

1. 分类与语法:

  • 系统解释器自动捕获异常
  • 写程序自己捕获并展示: try---except---else---finally
  • 注1:一旦引发了一个异常,程序就不会往下走,就不会引发其他的异常
  • 注2:try包住有可能会出错的代码块,然后为它定义一个except部分输出异常信息。那么try部分一旦发生异常,整个程序就不会因为异常而终止,而是去执行except部分,并且会继续往下跑程序。
  • 注3:当try部分没有出错,就继续执行else。
try:
    num = 100
    print(num) #如果传入的num写成了numm
except NameError as errorMsg:
    print('产生错误了:%s'%errorMsg)
else:
    print('没有捕获到异常,真高兴')
  • 注4:不管try--except--else怎么执行,finally一定会执行
  • 注5:try和except必须有, else 和 finally可以没有。
  • 注6:在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。 比如文件关闭,释放锁,把数据库连接返还给连接池等
import time
f = None
try:
    f = open('test.txt')    
    try:        
        while True:
            content = f.readline()            
            if len(content) == 0:                
                break
            time.sleep(2)
            print(content)    
    except: 
        pass #如果在读取文件的过程中,产生了异常,那么就会捕获到,比如按下了ctrl+c终止cmd窗口
    finally:
        if f: #存在f并且f为True
            f.close()
            print('关闭文件')
except:
    print("没有这个文件")

2. 异常的传递:

如果发生了一个异常,却没有对应的except语句来处理异常,这个异常就会向上一层抛。

  • try嵌套中传递:

    f = None
    try:
    f = open("test.txt")
    try:
    while True:
    line = f.readline()
    ind = line.index("hello") #查找hello的起始位置 {有可能发生ValueError}
    x = 10/0 #有可能发生ZEROERROR,但此处不用except处理它,异常会向上层抛
    #此处的上层即上一个try-except的except部分,如果它也不能处理
    #再向上一层的try-except抛...直至遇到最底层的异常基类ExceptionError
    if (line == ''):
    break
    except ValueError as ex: #仅仅捕捉了ind = line.index("hello")这里的异常,x=10/0没有捕捉
    print(ex)
    finally:
    print("里层的finally") #不一定会执行,有可能代码执行第二行open异常,就直接去外层的except语句了
    except (FileNotFoundError,ZeroDivisionError) as ex: #此处能处理x = 10/0,否则继续向上层抛
    print(ex)
    finally:
    print("finally")
    if f:
    f.close()

  • 函数调用中传递:

由里层函数向外层函数抛,若外层也不能处理,就被基类ExceptionError接收,由编译器处理

def test1():
    print("----test1-1----")
    print(num)
    print("----test1-2----") #不会运行
    
def test2():
    print("----test2-1----")
    test1() #发生异常,向外层函数抛,但没有try-except处理,所以会抛至基类ExceptionError,由编译器处理
    print("----test2-2----") #不会运行
        
def test3():
    try:
        print("----test3-1----")
        test1() #test1里面的异常会被传递至调用它的函数(由内向外抛)
        print("----test3-2----") #不会运行    
    except Exception as result:
        print("捕获到了异常,信息是:%s"%result)
    print("----test3-3----") #不会运行
        
test3()
print("\n")
test2()
posted @ 2018-03-04 14:17  hzhang_NJU  阅读(103)  评论(0编辑  收藏  举报