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("没有这个方法")

 

posted @ 2020-08-23 20:52  Magicianlx  阅读(154)  评论(0编辑  收藏  举报