zoukankan      html  css  js  c++  java
  • 第十二章 异常

    一、 异常的概念

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

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

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

    【异常向上传播】
        > 如果异常在函数中产生,会传播给函数的调用者
        > 如果异常在模块的顶级位置,会传播给引用该模块的模块
        
        
        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)

  • 相关阅读:
    Java堆、栈和常量池
    Java多线程内存模型
    To-do List
    Java Collections Framework 汇总
    关于ArrayList.clear()与=null以及new ArrayList<E>()
    开源协议
    git-svn — 让git和svn协同工作
    Java Collections Framework 之 RandomAccess接口
    转 : CSS Modules详解及React中实践
    转 : JBoss Web和 Tomcat的区别
  • 原文地址:https://www.cnblogs.com/geoffreyone/p/9899762.html
Copyright © 2011-2022 走看看