Python(八)-异常处理与反射

第一章  异常处理

一、基础异常处理结果(最常用)*****

try:
    代码块
except Exception as e:
    代码块
   # 将日志写在这里,将错误信息写入日志文件

二、复杂处理结构(常用)*****

try:
    ...(正代码)
excrpt:
    ...(抓取错误的代码)
else:
    ...(没有错误的代码)
finally:
    ...(不管有没有错误,都会执行)

三、异常对象*****

try:
    代码块
    ....
    代码块
except Exception as obj:
    print(obj)
    #obj就是封装了当前触发的错误信息。
类似成:
class Message:
    def __init__(self,name)
        self.name = name
obj = Message('ssss')

四、异常种类*****

  描    述:所有报错的种类都是继承了一个总的类(Exception),Exception可以抓到所有错误,是一个统一错误输出,其他,只能处理某一种情况,为了精准定位问题。

  例    子:

    try:
        int('sds')
        l = [11,22]
        l[100]
    
    except IndexError as e :
        print('indexerror') #1.log
    except ValueError as e :
        print('valuerror')    #2.log
    except  Exception as e:
        print('exception')
    else:
        print('else')
    finally:
        print('finally')

五、主动触发异常*****

  描    述:主动触发异常主要是为了有的时候到了一定的位置上就触发一个自定义的异常,在Python3中,创建一个基类就是利用触发异常来完成的。

  例    子:

 raise Exception('邮件发送失败')
   程序分层:
    def execute():
        try:
            result = fool() #返回1或0
            if result:  #如果是1,则成立,继续往下走
                pass
            else: #否则就是0,不成立,就报错
                raise Exception('邮件发送失败')
            fool2()
        except Exception as e:
            print('记录日志') 

六、断言

  描    述:断言就是一个异常处理的简写,而且断言是一个硬性条件。

  作    用:一、让程序是要不满足条件,就立刻终止。二、起到一个警示的作用,被人砍你的代码就知道这个条件必须走才能往下走。

  例    子:

assert 条件 
    如果条件是True,就无感知往下执行。
    如果条件是Fales,就会直接报错。

七、自定义异常

  描     述:自己利用可以继承Exception的特点,定义一个错误。

  例     子:

class HaiTaoError(Exception):
    def __init__(self, message):
        self.msg = message
super(HaiTaoError, self).__init__(message)

try:
    name = 'chenxin'
    if name != 'haitao':
            raise HaiTaoError('你不能进入我的身体')
except HaiTaoError as e:
    print(e,e.msg)
except Exception as e:
    print(e,111)

 第二章 反射

2.1 反射介绍

  在Python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,该四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。

#hasattr(对象(容器,模块),'名称')  #以字符串的形式判断某个对象中是否有指定的属性。
#getattr(对象(容器,模块),'名称')  #以字符串的形式在某个对象中获取指定的属性。
#setattr(对象(容器,模块),'名称') #以字符串的形式在某个对象中添加指定的属性。
#getattr(对象(容器,模块),'名称') #以字符串的形式在某个对象中删除指定的属性。

2.2 反射用法

  1、用户请求的URL,使用反射的方式将URL相应的方法调用出来。

代码描述:
    目录结构:    controller目录与app.py在同一个目录
                       controller/accout.py
acoout.py
     def login():
          return '请输入用户名'
     def logout():
          return '跳回登陆洁面'
app.py
    #/usr/bin/env python
    while True:
        inp = input('请输入URL:')
        m,n =    inp.split('/')
        try:
            module = __import__('controller.%s'% m,fromlist=True)
            # print(module)
            if hasattr(module,n):
                v = getattr(module,n)
                result = v()
            else:
                result='404'
        except Exception as e:
            result = 500
        print(result)

结果:
    请输入URL:account/login
    请输入用户名
    请输入URL:account/logout
    跳回登陆洁面
    请输入URL:

结论:反射是通过字符串的形式操作对象相关的成员。一切事物都是对象!!!

    即可以使用反射将所有的对象查找和获取出来,字符串、变量、模块、类、方法、函数、等等。

原文地址:https://www.cnblogs.com/cxcx/p/6137893.html