python 在程序运行出现错误时时有相应的反应机制 , 我们可以针对不同的错误做出不同的响应
- list1 = ['a','b','c']
- print(list1[4]) #>>>IndexError: list index out of range
- a = {"name":"Jack",
- "age":22}
- print(a["sex"]) #KeyError: 'sex'
例子中分别指出了两个错误: IndexError 和 KeyError. 如果我们想对程序中是否出现了这种错误, 可以抓取出来. 下面我们就针对这两种错误举例
- list1 = ['a','b','c']
- a = {"name":"Jack",
- "age":22}
- try:
- list1[2]
- a["sex"] #这里是有错的!
- except IndexError as e:
- print("列表操作错误",e)
- except KeyError as e:
- print("没有这个 key",e)
当 try 里的代码出现错误的话, 通过 except 把错误获取
C:\Users\Aaron\Anaconda3\python.exe D:/python/week7 / 错误处理. py
没有这个 key 'sex'
运行结果
这样就会得到了, 可是如果会有很多种错误的话, 每种错误都加个 except 也太麻烦了! 就可以这么写:
- list1 = ['a','b','c']
- a = {"name":"Jack",
- "age":22}
- try:
- list1[5] #这里是有错的!
- a["sex"] #这里是有错的!
- except (IndexError,KeyError) as e:
- print("错误!",e)
但又出了个问题, 用这种写法的话当出现错误, 不能很好的显示错误的种类例子中两个条件都是错误的, 只能显示成
C:\Users\Aaron\Anaconda3\python.exe D:/python/week7 / 错误处理. py
错误! list index out of range
运行结果
所以这种方式是不推荐使用的! 可是既然可以这么写, 是不是有其他的作用呢? 这时需要一个另外的用法 -- 万能异常: Exception, 可以把所有的错误抓取. 这时候就可以做排除已知错误外的所有未知错误.
- list1 = ['a','b','c']
- a = {"name":"Jack",
- "age":22}
- try:
- list1[2]
- a["name"]
- open("没有这个文件. txt")# 这里是有错的!
- except IndexError as e:
- print("列表操作错误",e)
- except KeyError as e:
- print("没有这个 key",e)
- except Exception as e:
- print("未知错误",e)
在前面的错误类型都没有的话, 可以显示最后的错误!
C:\Users\Aaron\Anaconda3\python.exe D:/python/week7 / 错误处理. py
未知错误 [Errno 2] No such file or directory: '没有这个文件. txt'
运行结果
总而言之, 一般的异常处理结构是这样的:
- list1 = ['a','b','c']
- a = {"name":"Jack",
- "age":22}
- try:
- list1[2]
- a["name"]
- open("没有这个文件. txt")# 这里是有错的!
- except (IndexError,KeyError) as e:
- print("列表操作错误",e)
- except KeyError as e:
- print("没有这个 key",e)
- except Exception as e:
- print("未知错误",e)
- else:
- print("一切正常")
- finally:
- print("无论是否发生异常, 这里的代码都要执行")
我们现在看一看常用的异常代码
AttributeError 试图访问一个对象没有的属性, 比如 foo.x, 但是 foo 没有属性 x
IOError 输入 / 输出异常; 基本上是无法打开文件
ImportError 无法引入模块或包; 基本上是路径问题或名称错误
IndentationError 语法错误 (的子类) ; 代码没有正确对齐
IndexError 下标索引超出序列边界, 比如当 x 只有三个元素, 却试图访问 x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C 被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python 代码非法, 代码不能编译 (个人认为这是语法错误, 写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量, 基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值, 即使值的类型是正确的
常用异常
对了, 还有一种异常处理在程序调试中可以用到: 触发异常:
- try:
- raise KeyError
- except KeyError as e:
- print("没有这个 Key",e)
在 try 中加入 raise, 可以通过代码直接触发异常
最后, 还有一种异常的用法: 自定义异常
- class concect_Error(Exception):
- def __init__(self,msg):
- self.msg = msg
- try:
- raise concect_Error("数据库连接失败")
- except concect_Error as e:
- print(e)
要注意的是, 在定义错误的类中, 一定要继承 Exception 的属性. 自定义的类是属于 Exception 这个大类的!
来源: http://www.bubuko.com/infodetail-2880131.html