一:什么是异常?
异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),在python中,错误触发的异常如下
而错误类型分为两种,一种是语法错误,一种是逻辑错误:
语法的错误在文件执行前读取代码时,就会检测语法,如果有语法错误,文件内的代码不会执行,就会直接崩溃
而逻辑错误,在语法的检测阶段,并不会报错,当代码执行到错误的地方时,才会触发错误,程序会发出错误信号,如果没有机制对错误进行处理,那么就会抛出异常,程序也就终止了
二:常见异常种类
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
三:异常处理
为了保证程序的健壮性与容错性性,即在遇到错误时不会崩溃,我们需要对异常进行处理
3.1可预知条件下的异常处理
上面的代码是做数学运算,如果输入的不是数字,那么只算就会出现异常,要保证输入的是数字,那么就能避免异常,这种可预知的异常条件,可以用上面的方法来避免
3.2不可预知条件下的异常处理
在这种情况下,我们需要用到try....except:在错误发生进行处理,做好相应的应对机制
上面的代码,并不能准确的预知到文件内的数据上面时候被迭代取完,发生错误的条件不可预知,但是对于错误类型可以预见,于是在错误发生后,截获异常类型,执行f.close()通知操作系统回收资源
异常类只能处理指定的异常情况,如果非指定异常则无法处理
异常处理可以多分枝进行,同时监测三种异常
但是有的时候我们需要统一处理一切的异常,这是后就需要万能异常了
将多分枝异常与万能异常结合起来用,间距两者的优点,既可以处理一切异常,也可以按照指定要求处理特定的异常
3.3异常的其他结构
try....else
try....finally
主动触发异常
自定义异常
断言assert条件
打断程序的方式,相比于主动抛出异常来说,断言,代码结构更加简洁,不会破坏原代码结构的只管感受,代码量也相对较少
总结
1、把错误处理和真正的工作分开来
2、代码更易组织,结构更清晰,复杂的工作任务更容易实现
3、程序变得更加健壮,不易崩溃