python异常
常见的异常种类
AssertionError | 断言语句(assert)失败 |
---|---|
AttributeError | 尝试访问未知的对象属性 |
EOFError | 用户输入文件末尾标志EOF(Ctrl+d) |
FloatingPointError | 浮点计算错误 |
GeneratorExit | generator.close()方法被调用的时候 |
ImportError | 导入模块失败的时候 |
IndexError | 索引超出序列的范围 |
KeyError | 字典中查找一个不存在的关键字 |
KeyboardInterrupt | 用户输入中断键(Ctrl+c) |
MemoryError | 内存溢出(可通过删除对象释放内存) |
NameError | 尝试访问一个不存在的变量 |
NotImplementedError | 尚未实现的方法 |
OSError | 操作系统产生的异常(例如打开一个不存在的文件) |
OverflowError | 数值运算超出最大限制 |
ReferenceError | 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象 |
RuntimeError | 一般的运行时错误 |
StopIteration | 迭代器没有更多的值 |
SyntaxError | Python的语法错误 |
IndentationError | 缩进错误 |
TabError | Tab和空格混合使用 |
SystemError | Python编译器系统错误 |
SystemExit | Python编译器进程被关闭 |
TypeError | 不同类型间的无效操作 |
UnboundLocalError | 访问一个未初始化的本地变量(NameError的子类) |
UnicodeError | Unicode相关的错误(ValueError的子类) |
UnicodeEncodeError | Unicode编码时的错误(UnicodeError的子类) |
UnicodeDecodeError | Unicode解码时的错误(UnicodeError的子类) |
UnicodeTranslateError | Unicode转换时的错误(UnicodeError的子类) |
ValueError | 传入无效的参数 |
ZeroDivisionError | 除数为零 |
try - except语句
类似于java的try-catch语句,用于异常的检测与处理,语法为
try:
检测范围
except Exception [as reason]:
出现异常Exception时的处理代码
其中 Exception 是异常种类,如果缺省,则默认是所有种类,且不能加as reason;reason是错误的信息或者说是原因,是对应异常的类的对象,可以转换为String类型来输出。
一个try可以对应多个except
当try中出现异常时,会直接跳到except部分寻找对应的异常处理,执行处理代码,若没有找到对应的异常处理,则会报错
except后面也可以跟一个异常类组成的元组,对这个元组里所有的异常种类执行相同的操作;当抛出的异常属于该元组的元素时,执行这段异常处理代码。例如
try:
x = 1 + '2'
y = 2 / 0
except (ZeroDivisionError,TypeError) as reason:
print('出错了:'+str(reason))# 出错了:unsupported operand type(s) for +: 'int' and 'str'
try:
y = 2 / 0
x = 1 + '2'
except (ZeroDivisionError,TypeError) as reason:
print('出错了:'+str(reason))# 出错了:division by zero
带finally的try - except语句
和java的finally语句一样,其语法规则为
try:
检测范围
except Exception [as reason]:
出现异常Exception时的处理代码
finally:
无论如何都会执行的代码
在绝大多数情况下,只要执行了try,finally里的代码都会执行,即使try中有return语句,或者sys.exit(0)退出程序,finally里的代码也会执行,例如
import sys
import os
def fun1():
try:
return
int('ab')
except ValueError as reason:
print(type(reason))
finally:
print('执行了finally语句')
def fun2():
try:
sys.exit(0)
int('ab')
except ValueError as reason:
print(type(reason))
finally:
print('执行了finally语句')
fun1()
fun2()
# output:
# 执行了finally语句
# 执行了finally语句
但当使用os._exit(0)关闭重启整个shell时,则finally不会执行,例
import sys
import os
def fun1():
try:
os._exit(0)
int('ab')
except ValueError as reason:
print(type(reason))
finally:
print('执行了finally语句')
fun1()
raise
用于手动抛出异常,用法如下
raise [ExceptionName[(reason)]]
其中ExceptionName
表示异常类型,而reason
表示异常所携带的信息,通常是原因,两个参数都可缺省
也就是说,raise 语句有如下三种常用的用法:
raise
:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。raise 异常类名称
:raise 后带一个异常类名称,表示引发执行类型的异常。raise 异常类名称(描述信息)
:在引发指定类型的异常的同时,附带异常的描述信息。
例如:
raise ZeroDivisionError("除数不能为零")
参考网站:http://c.biancheng.net/view/2360.html
assert断言
和raise
类似,使用更加方便,但不够灵活,可用于单元测试,参数合法判断等,语法如下
assert 布尔表达式[, 错误信息]
当布尔表达式为True
时,程序继续运行,否则,抛出AssertionError
异常,并携带错误信息,例如
assert a<0, 'a不能小于0'