Python实战之常见异常以及自定义异常

异常种类

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

常用异常

AttributeError #试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x

IOError    #输入/输出异常;基本上是无法打开文件

ImportError #无法引入模块或包;基本上是路径问题或名称错误

IndentationError #语法错误(的子类) ;代码没有正确对齐(缩进的问题)

IndexError #下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]

KeyError #试图访问字典里不存在的键

KeyboardInterrupt #Ctrl+C被按下

NameError #使用一个还未被赋予对象的变量

SyntaxError #Python代码非法,代码不能编译(个人认为这是语法错误,写错了)

TypeError #传入对象类型与要求的不符合

UnboundLocalError #试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它

ValueError   #传入一个调用者不期望的值,即使值的类型是正确的

不常用异常

ArithmeticError  AssertionError  AttributeError  BaseException  BufferError

BytesWarning  DeprecationWarning  EnvironmentError   EOFError

Exception  FloatingPointError  FutureWarning  GeneratorExit  ImportError ImportWarning   IndentationError   IndexError   IOError   KeyboardInterrupt

KeyError   LookupError   MemoryError   NameError   NotImplementedError

OSError   OverflowError   PendingDeprecationWarning   ReferenceError

RuntimeError   RuntimeWarning   StandardError   StopIteration  SyntaxError

SyntaxWarning   SystemError  SystemExit   TabError     TypeError

UnboundLocalError  UnicodeDecodeError  UnicodeEncodeError  UnicodeError

UnicodeTranslateError  UnicodeWarning  UserWarning   ValueError

Warning   ZeroDivisionError

异常试验

__author__ = "Burgess Zheng"

def bulk(self):
    print("%s is yelling...." %self.name)

class Dog(object):
    def __init__(self,name):
        self.name = name

    def eat(self,food):
        print("%s is eating..."%self.name,food)



#d = Dog("NiuHanYang")
#choice = input(">>:").strip()#假如输入的是dd
#getattr(d,choice)#getattr(d,choice) == d.输入
#由于实例d 没有该dd属性或者实例d继承的类没有该dd方法就会报错


'''
#测试异常报错
names = ['alex','jack']
data = {}
#names[3] #调取names下标3的元素,由于names列表只有下标0 和1 ,所以报错
          #而且一般程序出错了就不会往下执行了
#data['name'] # 调取data字典的key name 由于data该字典没有该key所以报错
        
#虽然程序出现异常,但我不想让客户知道。
'''

'''
#每个异常单独判断抓取KeyError:key的错误 IndexError下标错误
names = ['alex','jack']
data = {}

try:#尝试下面执行的代码
   data['name']#调取data字典的key name,由于没有该key报错
   names[3]#调取names下标3的元素由于没有该元素报错
except KeyError as e:#KeyError: key的错误
                      #e:c异常的详细信息
     print("没有这个key",e)

except IndexError as e:#IndexError:列表错误
    print("没有该下标",e)
'''

'''
#一行多个异常判断进行抓取.

names = ['alex','jack']
data = {}

try:#尝试下面执行的代码
   names[3]#调取names下标3的元素由于没有该元素报错
   data['name']#调取data字典的key name,由于没有该key报错
except (KeyError,IndexError) as e:#e:c异常的详细信息
    print("代码输入有错误",e)
#但是有个问题(如果第一行names[3]出错,就不会往下执行了
#报错的信息你根本就不知道是哪个的错误,所以一般使用上面一种拆开方式异常处理
#当然你觉得反正出错了也就是这样几个,而且我不在乎,那就写在一起也行
'''

'''
#不管任何错误,抓住所有异常Exception :所有异常
names = ['alex','jack']
data = {}

try:
    names[3]  # 调取names标3的元素由于没有该元素报错
    data['name']  #调取data字典的key name,由于没有该key报错
except Exception as e:#Exception:抓住所有的异常错误
                        # e:c异常的详细信息
    print("出错了",e)#把异常错误打印出来
#一般我们都用第一种,每个异常单独做判断,这样才好拍错,
'''

#由于异常过多,所以我们需要一个未知错误
#else:的作用 和finally:的作用
names = ['alex','jack']
data = {}
try:
    #names[3]
    #data['name']
    #open("tes.txt")
    a=1
    print(a)
except KeyError as e:#KeyError:抓住key的错误 #e:c异常的详细信息
     print("没有这个key",e)
except IndexError as e:  # IndexError:抓住列表错误 #e:c异常的详细信息
    print("列表操作错误", e)
except Exception as e:#Exception:抓住所有的异常错误
    print("未知错误", e)
# 由于异常比较多,我们使用的就是常用的异常抓取,其他的我们就列为未知错误

else:                 #如果操作正常执行以下
    print("一切正常")
finally:              #操作无论是否正常 真心以下
    print("不管有没有错,都执行")

#缩进语法错误是抓不到了
#python3和Python2的区别
#python3:except xxx as e  
#python2:except xxx,e

自定义异常试验

__author__ = "Burgess Zheng"

class BurgessError(Exception):#Exception:所有的异常
    #类BurgessError 继承异常Exception
    #简单理解就是现在BurgessError和其他异常一样,是个自定义异常
    def __init__(self, msg):
        self.message = msg

try:
    raise BurgessError('数据库连不上')
    #('数据库连不上')作为BurgessError异常的形参 msg = 数据库连不上
    #raise触发BurgessError异常
except BurgessError as e:#抓取BurgessError异常里自定义的信息
    print(e)#得到自定义的异常信息
#自定义异常的名字最好不要和本身系统的异常名字一样,会导致抓取效果不一致,且又不能完全覆盖

猜你喜欢

转载自blog.csdn.net/Burgess_zheng/article/details/85763375