Python异常处理
2018-06-26 09:27 钱先生 阅读(227) 评论(0) 编辑 收藏 举报参考: http://www.cnblogs.com/wupeiqi/articles/5017742.html
常见异常类型
- AttributeError
- 试图访问一个对象没有的属性.
- IOError
- 输入/输出异常, 通常是无法打开文件(python2.7是这样. python3无法打开文件是FileNotFound)
- ImportError
- 无法引入模块或包, 基本上是路径问题或名称错误
- IndentationError
- 语法错误(的子类): 代码没有正确对齐(缩进有问题)
- 这会导致根本没法编译, 所以用try...except...无法抓住这个错误.
- IndexError
- 下标索引超出序列边界. 比如当x只有三个元素, 却试图访问x[5]
- KeyError
- 试图访问字典里不存在的键
- KeyboardInterrupt
- ctrl+C被按下
- NameError
- 使用一个还未被赋予对象的变量
- SyntaxError Python
- 代码语法错误
- 这会导致根本没法编译, 所以用try...except...无法抓住这个错误.
- TypeError
- 传入对象类型与要求的不符合
- UnboundLocalError
- 试图访问一个还未被设置的局部变量, 基本上是由于另有一个同名的全局变量, 导致你以为正在访问它
- ValueError
- 传入一个调用者不期望的值, 即使值的类型是正确的
#!/usr/bin/python # -*- coding: utf-8 -*- 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 %s...", self.name, food) def walk(self): print("%s is walking...", self.name) d = Dog("NHY") choice = input(">>:").strip() getattr(d, choice) # 若用户输入的choice不存在, 会报错 names = ['alex', 'jack'] data = {} data['name'] # name不存在, 会报错. 要捕捉这个错误并进行预处理, 需要try...except. try: names[3] data['name'] except KeyError as e: print("没有这个key", e) # e就是获取错误的详细信息. 返回"没有这个key 'name'" except IndexError as e: print("列表操作错误", e) # 也可以不写错误详细信息, 只写except IndexError. 则只返回"列表操作错误." """ 可以把exception放在一起处理(如下例). 劣势: 这样就不知道哪句代码导致了错误, 不方便debug. 优势: 若不管出哪种错误都可以用同样的处理方法解决, 那就可以这样写, 更简洁. """ try: names[3] data['name'] except (KeyError, IndexError) as e: print("没有这个key", e) """ 一次性把所有错误抓出来 (类似java中的exception), 可以这样写: """ try: names[3] data['name'] open("text.txt") except Exception as e: print("出错了", e) """ 异常 try: code except (Error1, Error2) as e: print (error 描述, e) except Exception: 抓住所有错误, 建议用在最后当做兜底条款. """ """ 兜底 Exception: 其它所有未知错误. else: 如果没有任何错误才执行. finally : 不管有没有错都执行. """ try: names[3] data['name'] except KeyError as e: # as 是python3.0写法. python2.7写法: except KeyError, e: print("没有这个key", e) # e就是获取错误的详细信息. 返回"没有这个key 'name'" except IndexError as e: print("列表操作错误", e) except Exception as e: # 其他所有错误 print("未知错误", e) else: # 没有任何错误的时候执行 print("一切正常") finally: # 不管有没有错, 都执行 print("不管有没有错, 都执行")
自定义异常
#!/usr/bin/python # -*- coding: utf-8 -*- class AlexException(Exception): def __init__(self, msg): self.message = msg def __str__(self): # 定义打印这个类返回什么格式. # return self.message # print(e)返回"数据库连接失败" return 'abcd' # print(e)返回'abcd' try: raise AlexException('数据库连接失败') # 触发异常 except AlexException as e: # e 就是'数据库连接失败'. e返回的格式在__str__()方法里定义. print(e) # 返回"数据库连接失败"