第十二章 异常

一、 异常的概念

错误: 编译器
异常: 运行期, 程序没有正常按照期望执行

异常产生时,在对应位置产生异常类型对象,程序“暂停”,如果上下文有异常处理程序,对应处理;

                                                                                                                没有则“异常向上传播”,报错退出;

【异常向上传播】
    > 如果异常在函数中产生,会传播给函数的调用者
    > 如果异常在模块的顶级位置,会传播给引用该模块的模块
    
    
    eg.
    def N()
        print(1/0)
    def A():
        N()
        
二、 异常的常见类型
1. BaseException    
    --- 所有异常的父类
    Exception
    --- 普遍异常,BaseException的子类,处理普遍的异常子类
    (1) ZeroDivisionError
        除数为0的异常
    (2) NameError
        名字错误异常,在命名空间中找不到抛出异常
    (3) TypeError
        类型不匹配
    (4) AttributeError
        属性异常
    (5) IndentationError 
        缩进异常
    (6) IndexErroe
        索引越界异常
    (7) UnboundLocalError
        局部变量访问异常, 未初始化
    (8) AssertionError
        断言异常,即断言调试时异常
    (9)    ImportError
        模块不存在
    (10)KeyError
        字典中的Key不存在
    (11)ReferenceError
        递归异常
    (12)SyntaxError
        语法错误
    (13)StopIteration
        迭代终止异常
    (14)ValueError
        数值异常,如int('a')
        

三. 异常处理

1. try - expect
    处理格式:
    try:
        可能产生异常的程序
    except 异常类型1:
        恢复措施
    except 异常类型2:
        恢复措施
    ……
    except 异常类型n:
        恢复措施
    注意:
        excrpt :
            # 此时全部异常被捕获
                
        
2. try - expect的处理情形:
    (1)    try语句块没有产生异常
        --- 没有异常,继续执行try-except之后的语句
    (2)    try语句块中产生异常,except捕获了该异常
        --- 执行先匹配成功的分支
        --- 异常的合并,(异常类型1,异常类型2...)
    (3)    try语句块中产生异常,且except没有捕获该异常
        --- 异常会继续向上传播(传播给函数的调用端或模块的引入处)
    注意:
        异常处理的时候,一般都是在调用端进行捕捉异常,以方便对异常进行不同的处理。
    注意:
        > 不能捕捉的异常属于编译器出现的错误
        > except分支之间存在继承关系,需要将父类异常放在子类异常的后面
    
3. 异常中的finally和else
    (1)    格式:
    try:
        可能异常
    excepy 异常种类:
        处理异常
    else:
        子句: 没有异常时执行,有异常抛出则不执行
    finally:
        子句: 无论有没有抛出异常都会执行
    (2) 作用:
    else: 
    finally:    必须操作,如释放资源、关闭文件、关闭数据库
    
    eg.
    def fun():
        x = 1
        try:
            return x
        finally:
            #① return 3
            #② x = 2
    fun()
    如果:①    3    --- 如果两个return, finally的覆盖了前面的
          ②    1    --- 
4. 强制异常
    (1) 格式
        raise 异常类型
    (2) 用法
        a. except
        b. 直接抛出异常
        
        eg1.
        try:
            1/0
        expert:
            print('出现了除数为0的异常')
            raise ZeroDivisionError
        eg2.
        raise ZeroDivisionError('除数为0的异常')

四、 自定义异常
    格式:
    继承自Exception
    重写__init__
    
class MyException(Exception):
    def __init__(self.value):
        self.value = value
# except 异常类型 as 变量:
    变量会绑定异常对象
    
    try 
        raise MyException()
    except MyException as err:
        print(err.value)

猜你喜欢

转载自blog.csdn.net/u010359398/article/details/81213273