• 8.23_python_lx_day27


    一.认识异常处理

    BaseException  所有异常类的父类(基类,超类)

    Exception    常见异常类的父类

    AssertionError  断言语句(assert)失败

    """
    断言就是猜的意思
    assert 和 if 之间的区别在于
    assert 在断言失败时候,是直接报错,抛出异常,后面的代码直接终止了.
    if     在判断为False 的时候,不执行代码
    """

    StopIteration  迭代器没有更多的值

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

    IndentationError  缩进错误

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

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

    IndexError  索引超出序列的范围

    二.异常处理的基本语法

    (1) 基本语法

    • try ... except ...
    • 把有问题的代码放到try这个代码块当中
    • 如果出现了异常,会直接执行except这个代码块中的内容
    • 作用:防止异常抛错,终止程序.

    (2) 带有分支的异常处理

    • except + 异常错误类 特指发生在这类异常错误时,要执行的分支
    class A():
        a = 10
    obj = A()
    try:
        # IndexError
        # lst = [1,2,3]
        # print(lst[90])
        
        # KeyError
        # dic = {}
        # print(dic["a"])
        
        # print(wangwen)
        obj.b()
        
    except IndexError:
        print("索引超出了范围")    
    except KeyError:
        print("字典中没有这个键")
    except NameError:
        print("没有这个变量")
    except:
        print("有异常错误...")

    (3) 处理迭代器异常错误

    def mygen():
        print("start ... ")
        yield 1
        yield 2
        yield 3
        return 4
    def mygen():
        print("start ... ")
        yield 1
        yield 2
        yield 3
        return 4
    
    # 初始化生成器函数 -> 返回生成器对象 -> 简称生成器
    gen = mygen()
    try:
        res = next(gen)
        print(res) #1
        res = next(gen)
        print(res) #2
        res = next(gen)
        print(res) #3
        res = next(gen)
        print(res) #StopIteration 
        
    except StopIteration as e :
        # 为当前异常错误类StopIteration的对象起一个别名叫做e
        # 在StopIteration内部有__str__的方法
        # 在打印对象时,直接获取生成器中的return的返回值.
        print(e) # 4
        print("生成器停止迭代")

    (4) 异常处理的其他写法

    <1>try ... finally ...  不论代码正确与否,都必须执行的代码放到finally当中. 

    • 一报错会终止掉程序,后面的代码不执行,有些必须要走的代码写在finally中
    try:
        lst = [1,2,3]
        print(lst[90])
    finally:
        print("被触发了..")
    print(123) # 此行代码因为报错不会执行

    <2>try .. except .. else ...如果try这个代码块没有异常错误,执行else这个分支,反之就不执行

    try:
        lst = [1,2,3]
        print(lst[90])
    except:
        pass
    else:
        print("正常执行结束...") # 因为报错所以不执行

    <3>try .. except .. else .. finally ..

    try:
        lst = [1,2,3]
        print(lst[90])
    except:
        print("异常处理222")  # 报错的情况下执行
    else:
        print("正常执行结束...") # 不报错执行
    finally:
        print("我被执行了111") # 一定执行

    三.主动抛出异常 

    (1)raise + 异常错误类  or 异常错误类对象

    <1>基本语法

    try:
        raise BaseException
    except BaseException:
        pass

    <2>简写

    try:
        raise 
    except:
        print("有异常错误")

    (2)自定义异常类 MyException (务必继承父类 BaseException)

    <1>(了解)系统底层获取行数和文件名的函数( 只有在程序异常时才能触发 )

    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 #返回文件名

    <2>通过get_value 主动抛出异常

    def get_value(n):
        try:
            raise
        except:
            return return_errorinfo(n)
    class MyException(BaseException):
        def __init__(self,num,msg,line,file):
            # 错误号
            self.num = num
            # 错误信息
            self.msg = msg
            # 错误行号
            self.line = line
            # 错误文件
            self.file = file
    sex = "雌雄同体"
    try:
        if sex == "雌雄同体":
            # raise + 异常错误类 或者 异常错误类对象
            raise MyException(404,"醒醒吧老弟,人类没有雌雄同体~",get_value(1),get_value(2))
    except MyException as e:
        # 对象.属性 
        print(e.num)
        print(e.msg)
        print(e.line)
        print(e.file)

    四.反射(针对于类对象或者模块)

    (1)概念: 通过字符串去操作类对象或者模块当中的成员(属性或者方法)

    class Man():
        pass
    class Woman():
        pass
    class Children(Man,Woman):
        skin = "绿色"    
        def eat(self):
            print("小孩一下生就拿了两串大腰子出来了")
        def drink(self):
            print("小孩一下生拿了两瓶勇闯天涯出来了")    
        def __suger(self):
            print("小孩自个的糖糖是不给别人的...")        
    obj = Children()

    (2)反射类对象中的成员

    <1>hasattr 检测对象/类是否有指定的成员

    ①对象

    res = hasattr(obj,"skin")
    print(res)

    ②类

    res = hasattr(Children,"eat")
    res = hasattr(Children,"__suger")
    print(res)

    <2>getattr 获取对象/类成员的值

    ①成员对象

    res = getattr(obj,"skin")
    print(res)

    ②对象:通过对象反射出来的方法是个绑定方法

    func = getattr(obj,"drink")
    func()

    ③类:通过类反射出来的方法是个普通方法

    func = getattr(Children,"eat")
    func(1)

    ④反射的成员不存在时,可以设置一个默认值防止报错

    res = getattr(obj,"abcdefg1234","该成员不存在")
    print(res)

    ⑤综合案例

    strvar = input("请输入你要使用的方法")
    if hasattr(obj,strvar):
        func = getattr(obj,strvar)
        func()

    <3>setattr 设置对象/类成员的值

    ①对象

    setattr(obj,"eye","白色")
    print(obj.eye)

    ②类

    setattr(Children,"sex","女性")
    print(Children.sex)
    print(obj.sex)

    <4>delattr() 删除对象/类成员的值 

    ①对象

    delattr(obj,"eye")
     print(obj.eye)  # error

    ②类

    delattr(Children,"sex")
    Children.sex # error

    (3)反射模块中的成员

    <1>基本语法

    import sys
    print(sys.modules) # 返回的是系统模块的一个字典
    # 获取当前本模块的对象 (通过__main__这个键来获取)
    print(sys.modules["__main__"])

    <2>综合案例

    def func1():
        print("我是func1方法")
    def func2():
        print("我是func2方法")
    def func3():
        print("我是func3方法")
    def func4():
        print("我是func4方法")
    while True:
        selfmodule = sys.modules["__main__"]
        strvar = input("请输入你要反射的方法") # 例func1 func2 ...
        if hasattr(selfmodule,strvar):
            func = getattr(selfmodule,strvar)
            func()
        else:
            print("没有这个方法")
  • 相关阅读:
    poj 1789 Truck History(最小生成树)
    POJ 3096 Surprising Strings(STL map string set vector)
    hdu 1412 (STL list)
    POJ 1552 Doubles (C++ STL set使用)
    poj 水题系列
    洛谷P4859 已经没有什么好害怕的了
    CF1228E Another Filling the Grid
    二项式反演
    AT [ABC177F] I hate Shortest Path Problem
    [NOI2020]制作菜品
  • 原文地址:https://www.cnblogs.com/Magicianlx/p/13550652.html
Copyright © 2020-2023  润新知