异常处理
异常
异常就是程序运行时发生错误的信号, 若程序没有处理之, 则抛出异常, 程序随之被迫终止
错误分语法错误和逻辑错误两种
常见异常种类:
AttributeError 试图访问一个对象没有的树形, 比如 foo.x, 但是 foo 没有属性 x
EOFError 遇到文件末尾引发的异常 如, 循环打开文件时
IOError 输入 / 输出异常; 基本上是无法打开文件
ImportError 无法引入模块或包; 基本上是路径问题或名称错误
IndentationError 语法错误 (的子类) ; 代码没有正确对齐
IndexError 下标索引超出序列边界, 比如当 x 只有三个元素, 却试图访问 x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C 被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python 代码非法, 代码不能编译 (个人认为这是语法错误, 写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量, 基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值, 即使值的类型是正确的
异常处理
如果错误发生的条件时可预知的, 需要用 if-else 语句进行处理: 在储物发生前做预防
如果错误发生的条件是不可预知的, 则需要用到 try....except: 在错误发生后做处理
1, 异常类只能用来处理指定的异常情况, 如果非指定异常则无法处理
- s1 = 'hello'
- try:
- int(s1)
- except IndexError as e: # 未捕获到异常, 程序直接报错
- print e
2, 多分支
- s1 = 'hello'
- try:
- int(s1)
- except IndexError as e:
- print(e)
- except KeyError as e:
- print(e)
- except ValueError as e:
- print(e)
3, 万能异常
- s1 = 'hello'
- try:
- int(s1)
- except Exception as e:
- print(e)
4, 多分支后加一个 Exception
5, 异常的 else,finally
- s1 = 'hello'
- try:
- int(s1)
- except IndexError as e:
- print(e)
- except KeyError as e:
- print(e)
- except ValueError as e:
- print(e)
- #except Exception as e:
- # print(e)
- else:
- print('try 内代码块没有异常则执行我')
- finally:
- print('无论异常与否, 都会执行该模块, 通常是进行清理工作')
6, 主动触发异常
7, 自定义异常
- class EgonException(BaseException):
- def __init__(self,msg):
- self.msg=msg
- def __str__(self):
- return self.msg
- try:
- raise EgonException('类型错误')
- except EgonException as e:
- print(e)
8, 断言 assert
assert 1==1 #即做判断, 不满足则抛出异常
总结:
把错误处理和真正工作分开, 即不能依赖异常
代码更安全, 不易因小错误就程序崩溃
来源: http://www.bubuko.com/infodetail-3356569.html