zoukankan      html  css  js  c++  java
  • python3之异常处理,断言和反射

    1、异常基础

    python在运行过程中,程序解释机制会测试代码,如检测不通过则会抛出异常。

    try:
        aa = 10
        bb = '10'
        cc = aa + bb
    except Exception as e:
        print('error:',e)
    
    #output输出异常,数字不能与字符向加
    error: unsupported operand type(s) for +: 'int' and 'str'


    try:
    aa = 10
    bb = '10'
    cc = aa + bb
    except TypeError as e:
    print('错误信息;',e)

    2、异常种类

    python中的异常种类非常多,每个异常专门处理某个项的异常!

    AttributeError     试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
    IOError            输入/输出异常;基本上是无法打开文件
    ImportError        无法引入模块或包;基本上是路径问题或名称错误
    IndentationError   语法错误(的子类) ;代码没有正确对齐
    IndexError         下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
    KeyError            试图访问字典里不存在的键
    KeyboardInterrupt   Ctrl+C被按下
    NameError           使用一个还未被赋予对象的变量
    SyntaxError         Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
    TypeError           传入对象类型与要求的不符合
    UnboundLocalError   试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
    ValueError          传入一个调用者不期望的值,即使值的类型是正确的
    s1 = 'hello'
    try:
        int(s1)
    except KeyError as e:
        print('键错误')
    except IndexError as e:
        print('索引错误')
    except TypeError as e:
        print('类型错误')
    except ValueError as e:
        print('值的类型错误')
    except Exception as e:
        print('错误')

    3、异常的结构

    try:# 主代码块

      pass

    except KeyError as e:# 异常时,执行该块

       pass

    else:# 主代码块执行完,执行该块

       pass

    finally: # 无论异常与否,最终执行该块

       pass

    4、自定义异常

    class MyException(Exception):
    
        def __init__(self, msg):
            self.message = msg
    
        def __str__(self):
            return self.message
    
    
    try:
        raise MyException('我的异常')  #raise为主动触发异常
    except MyException as e:
        print('>>>:',e)

    5、断言

    assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常

    assert 1 == 1
    print('---------------')
    assert 1 == 2
    
    #output,如果为真时不输出信息,如果为假时Flase则直接抛出异常
    ---------------
    Traceback (most recent call last):
      File "Z:/python_project/day18/ddd/yichang.py", line 26, in <module>
        assert 1 == 2
    AssertionError

    6、反射

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

    class A(object):
        def __init__(self):
            self.name = 'python'
            self.age = 18
    
        def func(self):
            return self.age
    
    obj1 = A()
    
    #检查对象是否含有成员
    print(hasattr(obj1,'age')) #True
    print(hasattr(obj1,'func')) #True
    
    #获取对象成员
    print(getattr(obj1,'name')) #python
    print(getattr(obj1,'func'))  #<bound method A.func of <__main__.A object at 0x000000C0C7B9D048>>
    
    #设置对象成员
    setattr(obj1,'slary',9999)
    print(getattr(obj1,'slary')) #9999
    
    #删除成员
    delattr(obj1,'slary')
    print(hasattr(obj1,'slary')) #False

    结论:反射是通过字符串的形式操作对象相关的成员

    class A(object):
        def __init__(self):
            self.name = 'python'
            self.age = 18
    
        def func(self):
            print('func:',self.name)
            return self.age
    
    obj1 = A()
    
    
    #通过获取对象的方法来执行对象方法
    obj = A()
    fun = getattr(obj,'func')
    fun()
  • 相关阅读:
    weekly review 200930: Battlestar Galactica
    weekly review 200926: loss memory
    weekly review 200924: LOST
    转贴:对话守则
    weekly review 200928: Return
    推荐:继续聚焦小升初——破解奥数迷题
    Centos+Nginx部署Vue项目
    centos7安装nginx
    flaskmigrate 处理sqlite数据库报错Constraint must have a name 的解决方案
    将阿里矢量图添加到elementui
  • 原文地址:https://www.cnblogs.com/zhangxinqi/p/8276839.html
Copyright © 2011-2022 走看看