• python之旅第八篇--异常


    判断类与对象关系

    isinstance #判断对象obj是否是由cls类创建的

    class Foo(object):
        pass
    obj = Foo()
    print isinstance(obj,Foo)
    ##如果对象是由类创建,则返回True,不是则返回False
    issubclass检查某类类是否是 某类的派生类
    class Foo(object):
        pass
    class Boo(Foo):
        pass
    print issubclass(Boo,Foo)
    
    ##检查Boo类是否是 Foo类的派生类,如果是的话返回True,否则返回False

    异常处理

     在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面

    举个简单例子:

    #不使用异常处理
    name = 'dicky'
    number = int(name)
    print number
    '''
    结果
    Traceback (most recent call last):
      File "H:/mywork/test/yichang/yichang.py", line 117, in <module>
        number = int(name)
    ValueError: invalid literal for int() with base 10: 'dicky
    '''
    
    #使用异常处理
    name = 'dicky'
    try:
        number = int(name)
    except Exception,e:
        print e
        
    '''
    结果
    invalid literal for int() with base 10: 'dicky'
    '''

    二、异常处理基础

     异常处理的一些解释

    1 try:
    2      #正常逻辑代码处理
    3     name = raw_input('请输入:')
    4     number = int(name)
    5 except Exception,e:
    6     print e
    7 '''
    8 这个e是对象Exception类创建的!Exception这里面封装了你上面逻辑块出现问题的所有错误,逻辑代码出现错误,这里的代码块就是如果上面的代码出现问题之后执行这个代码块的内容
    9 '''

     三、异常处理种类

     1 常见异常情况
     2 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
     3 IOError 输入/输出异常;基本上是无法打开文件
     4 ImportError 无法引入模块或包;基本上是路径问题或名称错误
     5 IndentationError 语法错误(的子类) ;代码没有正确对齐
     6 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
     7 KeyError 试图访问字典里不存在的键
     8 KeyboardInterrupt Ctrl+C被按下
     9 NameError 使用一个还未被赋予对象的变量
    10 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
    11 TypeError 传入对象类型与要求的不符合
    12 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
    13 导致你以为正在访问它
    14 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
     1 更多其他异常
     2 ArithmeticError
     3 AssertionError
     4 AttributeError
     5 BaseException
     6 BufferError
     7 BytesWarning
     8 DeprecationWarning
     9 EnvironmentError
    10 EOFError
    11 Exception
    12 FloatingPointError
    13 FutureWarning
    14 GeneratorExit
    15 ImportError
    16 ImportWarning
    17 IndentationError
    18 IndexError
    19 IOError
    20 KeyboardInterrupt
    21 KeyError
    22 LookupError
    23 MemoryError
    24 NameError
    25 NotImplementedError
    26 OSError
    27 OverflowError
    28 PendingDeprecationWarning
    29 ReferenceError
    30 RuntimeError
    31 RuntimeWarning
    32 StandardError
    33 StopIteration
    34 SyntaxError
    35 SyntaxWarning
    36 SystemError
    37 SystemExit
    38 TabError
    39 TypeError
    40 UnboundLocalError
    41 UnicodeDecodeError
    42 UnicodeEncodeError
    43 UnicodeError
    44 UnicodeTranslateError
    45 UnicodeWarning
    46 UserWarning
    47 ValueError
    48 Warning
    49 ZeroDivisionError
    View Code

    举例:

    1 li = [11,22,33]
    2 try:
    3     li[3]
    4 except IndexError,e:
    5     print e
    6 #结果list index out of range  

    异常情况分析,考虑所有可能出现的异常,异常的一般结构

     1 try:
     2     pass
     3 except KeyError,e: #指定一个异常
     4     pass
     5 except IndexError,e:
     6     pass
     7 except Exception,e:  #万能异常,能够处理所以异常情况
     8     pass
     9 else:   #当没有任何异常的时候执行else
    10     pass
    11 finally:  #不管上面是否出现异常,最后执行完之后,这里永远执行!finally什么时候用?你上面执行一个操作,连接数据库,我这里就可以执行,断开数据库释放资源!
    12     pass

     四主动触发异常

      比如我现在有一个连接数据库的模块,如果无法连接数据库的时候,这个会影响我剩下所有代码的进行,这时我需要主动去触发一个异常!

    1 def connect():
    2     return False  #无法连接数据库报错(假设无法连接数据库返回False)
     1 #!/usr/bin/env python
     2 #-*- coding:utf-8 -*-
     3 
     4 import model
     5 
     6 if __name__ == '__main__':
     7     try:
     8         result = model.connect()
     9         if result:
    10             print "33[32;1m连接成功33[0m"
    11         else:
    12             raise Exception('33[31;1m无法连接数据库33[0m')#无法连接的时候主动触发一个异常,这个异常的明细,是我自己来指定的
    13     except Exception,e:
    14         print e
    15 
    16 #使用raise来主动触发异常

     五 自定义异常

     异常原理解析 

     1 try:
     2      #正常逻辑代码处理
     3     name = raw_input('请输入:')
     4     number = int(name)
     5 except Exception,e:
     6     print e
     7 '''
     8 这个e是对象,由Exception类创建的!Exception这里面封装了你上面逻辑块出现问题的所有错误,逻辑代码出现错误,这里的代码块就是如果上面的代码出现问题之后执行这个代码块的内容
     9 
    10 通过上面的例子我们知道,e是由类Execption创建的,print e也就是打印了对象,以前我们知道print 一个对象输出__str__的内容,所以这里也就是输出了Exception类的__str__方法的内容。
    11 知道了这一点也就好自己定义异常了。

     简单的自定义异常

    1 class expect_error(Exception):
    2     def __str__(self):
    3         return "expect_error"
    4 
    5 try:
    6     raise expect_error
    7 except Exception,e:
    8     print e

    六 断言

    assert 1 == 1  #如果条件满足就不报错,如果条件不满足就会报错
    
    assert 1 == 2 
    
    '''
    这个和  raise Exception('string')  只要你定义了raise肯定会报错
    这个一般什么时候使用,比如我写了一个软件,上面有些条款:
    你必须接受,你不接受我就不让你用!
    '''

    七 反射

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

     1 class Person(object):
     2     def __init__(self,age):
     3         self.age = age
     4     def func(self):
     5         return 'func'
     6 
     7 obj = Person('19')
     8 ##检查是否含有成员####
     9 hasattr(obj,'age')
    10 hasattr(obj,'func')
    11 ##获取成员###
    12 getattr(obj,'age')
    13 getattr(obj,'func')
    14 ##设置成员#####
    15 setattr(obj,'age','20')
    16 setattr(obj,'show',lambda m:m+1)
    17 ##删除成员###
    18 delattr(obj,'age')
    19 delattr(obj,'show')
  • 相关阅读:
    【Oracle/PLSQL】没事玩一个简单的表充值程序
    findmnt命令查找已挂载的文件系统
    如何让shell脚本变成可执行文件
    在Linux中如何查看文件的修改日期
    Dutree – Linux上的命令行磁盘使用情况分析工具
    用FRP做内网穿透使用远程桌面连接家里的windows电脑
    Dog-用于DNS查询的命令行工具
    【DeFi】一文读懂预言机原理、类型、现状和发展方向
    Vitalik Buterin 解读 Nathan Schneider 论文:加密经济治理的局限与改进思路
    Vitalik:回顾区块链近 5 年经济学进展,以及新出现的问题
  • 原文地址:https://www.cnblogs.com/Dicky-Zhang/p/7542356.html
Copyright © 2020-2023  润新知