zoukankan      html  css  js  c++  java
  • Python 基础之面向对象之异常处理

    .认识异常

    1.常用异常报错的错误类型

    IndexError                索引超出序列的范围

    KeyError                  字典中查找一个不存在的关键字

    NameError                 尝试访问一个不存在的变量

    IndentationError          缩进错误

    AttributeError            尝试访问未知的对象属性

    StopIteration             迭代器没有更多的值

    AssertionError  断言语句(assert)失败

    EOFError                  用户输入文件末尾标志EOF(Ctrl+d)

    FloatingPointError        浮点计算错误

    GeneratorExit             generator.close()方法被调用的时候

    ImportError               导入模块失败的时候

    KeyboardInterrupt         用户输入中断键(Ctrl+c)

    MemoryError               内存溢出(可通过删除对象释放内存)

    NotImplementedError       尚未实现的方法

    OSError                   操作系统产生的异常(例如打开一个不存在的文件)

    OverflowError             数值运算超出最大限制

    ReferenceError   弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象

    RuntimeError              一般的运行时错误

    SyntaxError               Python的语法错误

    TabError                  Tab和空格混合使用

    SystemError               Python编译器系统错误

    SystemExit                Python编译器进程被关闭

    TypeError                 不同类型间的无效操作

    UnboundLocalError         访问一个未初始化的本地变量(NameError的子类)

    UnicodeError              Unicode相关的错误(ValueError的子类)

    UnicodeEncodeError        Unicode编码时的错误(UnicodeError的子类)

    UnicodeDecodeError        Unicode解码时的错误(UnicodeError的子类)

    UnicodeTranslateError     Unicode转换时的错误(UnicodeError的子类)

    ValueError                传入无效的参数

    ZeroDivisionError         除数为零

    2.较常见的报错进行举例

    # (1)IndexError   索引超出序列的范围
    # lst = [1,2,3,4,5]
    # res = lst[999]

    # (2)KeyError 字典中查找一个不存在的关键字
    dic = {'a':1,'b':2,'c':3}
    # print(dic["d"])

    # (3)NameError  尝试访问一个不存在的变量
    #print(hhh)

    # (4)IndentationError  缩进错误
    if 5 == 5:
        print(55)
      # print(444)


    # (5)AttributeError  尝试访问位置的对象属性
    class MyClass():
        a = 5
        b = 6
    obj = MyClass()
    #obj.c


    # (6)StopIteration  迭代器没有更多的值
    it = iter(range(3))
    for i in it:
        print(i)
    #res = next(it)

    # (7)AssertionError 断言语句(assert) 失败
    '''
    #猜一猜 3大于1 吗? 如果3大于1
    # 如果猜错了,直接抛异常
    # 一般用在程序测试中
    '''
    #assert 3<1

    """
    if 3<1:
       print("成立")

    """

    .异常处理基本语法

    #格式:
    try:
        code1
        code2
        ...
    except:
        code1
        code2

    把有可能出现异常的代码放到try这个代码块当中
    如果出现了异常错误,直接走execpt这个代码块

    1.异常处理基本语法

    ##例1:
    try:
        lst = [1, 2, 3, 4]
        print(lst[9999]) #因为没有9999的列表所有,所有程序有错误
    except:
        print("这个程序有错误")
        # pass

    2.多分支条件的异常处理

    execpt + 异常错误类 特指这种异常错误发生时,走该分支

    #例2:
    try:
        #以下(1)(2)(3)一一对应,把一一对应的注释去掉别的将其注释就会到想要的数字程序走
        #(1)
        # lst = [1,2,3,45,6]
        # print(lst[10])
        
        #(2)
        # dic = {'a':1}  
        # print(dic['b'])
        
        #(3)
        print(hh)
    except IndexError:
        #(1)
        print("走到这里,说明报的是索引下标越界错误.")
    except KeyError:
        #(2)
        print("走到这里,说明报的是字典的键出现错误")

    except:
        #(3)
        # 条件都不满足,走except分支
        print("程序有错误")

    3.处理迭代器越界错误

    借助异常处理类,接收生成器函数中的return 返回值
    ##例3:
    def mygen():
        yield 1
        yield 2
        return 3
    # 实例化生成器函数 产生生成器对象 简称生成器
    gen1 = mygen()
    try:
        res = next(gen1)
        res = next(gen1)
        res = next(gen1) # yield只有两次,所有第三次调用报错
        print(res)
    # as 及时用来起名字的,给StopIteration 的类[对象]起名字
    except StopIteration as e:
        '''
        当我们打印对象的时候,触发__str__魔术方法
        在StopIteration 这个类当中,自动接收异常return 的返回值
        通过打印对象触发__str__方法,进而把返回值打印出来
        '''
        print(e)

     

    三.主动抛出异常raise

    BaseExcepton 是所有异常类的父类(基类,超类) (子类的别名: 衍生类 派生类)
    Exception    是所有普通错误处理类的父类
    raise + (异常处理类  异常处理的对象)
    #格式:
    try:
        raise
    except:
        pass


    #返回时True .Exception 是 BaseException 的子类
    res = issubclass(Exception, BaseException)
    print(res)

    1.raise 语法的基本格式

    #完整写法
    try:
        #必须嵌入在try 这个代码里面使用
        raise BaseException
    except:
        print("这个程序抛出了异常")

    #简写写法
    '''
    try:
        raise
    except:
        print("程序抛出了异常")

    '''

    2.自定义异常类

    # return_errorinfo 必须要依靠异常的形式才能触发获取当前的行号或者文件名
    def return_errorinfo(n):
        import sys
        f = sys.exc_info()[2].tb_frame.f_back
        if n == 1:
            return str(f.f_lineno)  # 返回当前行数
        elif n == 2:
            return f.f_code.co_filename  # 返回文件名

    def get_info(n):
        try:
            raise BaseException
        except:
            return return_errorinfo(n)

    #如果想要自定义异常类,必须继承所有异常的父类BaseException
    class MyException(BaseException):
        def __init__(self, err_num, err_msg, err_line, err_filename):
            #打印错误号
            self.err_num = err_num
            #打印错误信息
            self.err_msg = err_msg
            #打印错误的行号
            self.err_line = err_line
            #打印错误文件
            self.err_filename = err_filename

    human_sex = "中性"

    try:
        if human_sex == "中性":
            raise MyException(1001, "人类没有中性", get_info(1), get_info(2))
    except MyException as e:
        #打印错误号
        print(e.err_num)
        #打印错误信息
        print(e.err_msg)
        #打印错误的行号
        print(e.err_line)
        #打印错误文件
        print(e.err_filename)

     

    3.try ... finally .... 使用

    try:
        print(name)
    #无论是否报错,都会执行finally里面代码块
    finally:
        pass
    如果有一些语句,计算在发送报错的情况也仍然要调用或处理一些逻辑
    那么使用finally

    #例:
    # try:
    #     print(name)
    #
    # finally:
    #     print(123)
    #     print(456)


    try这个代码块如果有错误,不执行else代码中的内容
    如果没有报错,那么执行else代码块中的内容
    try ... execpt ... else 要配合使用else 不能单独拿出来和try使用.
    try ... finally .... 可以配合在一起使用

    4.try ... execpt ... else使用

    try:
        #print(name)
        print(123)

    except:
        pass

    else:
        print(789)

  • 相关阅读:
    shell函数使用
    laravel调试神器tinker
    laravel 5.1 单元测试 Cannot modify header information 错误
    angular 使用rxjs 监听同级兄弟组件数据变化
    angular 有关侦测组件变化的 ChangeDetectorRef 对象
    XML文件操作类--创建XML文件
    (收藏)C#实现截屏
    (转)C#操作PPT
    (转).NET代码混淆实践
    (整理)RPC
  • 原文地址:https://www.cnblogs.com/hszstudypy/p/10964102.html
Copyright © 2011-2022 走看看