异常处理
在程序运行过程中,总会遇到各种各样的错误。
- 有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这种错误通常称之为bug,bug是必须修复的。
- 有的错误是用户输入造成的,比如让用户输入email地址,结果得到一个空字符串,这种错误可以通过检查用户输入来做相应的处理
- 还有一类错误是完全无法在程序运行过程中预测的,比如写入文件的时候,磁盘满了,写不进去了,或者从网络抓取数据,网络突然断掉了。这类错误也称为异常,在程序中通常是必须处理的,否则,程序会因为各种问题终止并退出。
- Python内置了一套异常处理机制,来帮助我们进行错误处理
错误类型
Python中的错误可以分为两种:语法错误和异常
其中主要的有:
语法错误
代码编译时的错误,不符合Python语言规则的代码会停止编译并返回错误信息。
缺少起始符号或结尾符号(括号、引号等)
缩进错误
关键词拼写错误
异常错误
异常错误一共有六种典型的异常:
除零错误
除零错误(ZeroDivisionError):除数为0。
名称错误
名称错误(NameError):变量使用前未进行申明或者初始化 。
类型错误
类型错误(TypeError):某些函数或者方法只适用于特定的数据类型,如果 对数据类型的操作不当,就会产生类型错误 。
数值错误
数值错误(ValueError):在输入类型正确的情况下,具体输入值错误 。
索引错误
索引错误(IndexError):超出序列长度的索引操作。
属性错误
属性错误(AttributeError):方法或者属性不适用该对象 。
捕获异常
高级语言通常都内置了一套错误处理机制,Python也不例外:在Python中可通过try…except…else…finally…机制捕获异常并进行处理。
比如:
li = [3, 2, 4, 1, 3, 2]
try:
# 里面放我觉得可能会出错的代码块
li[6]
except Exception as e:
# 出错之后你怎么处理? 略过 要么就是 打印错误
print(e)
else:
# 这里执行如果try的代码块没有出错才会执行
print("try 代码块没有错误")
finally:
# 这里的代码放try except 不管什么样的结果它都会执行
print("这句话必选打出来")
print("代码继续执行")
抛出异常
Python 使用 raise 语句抛出一个指定的异常:
例如执行以下代码会触发异常:
x = 10
if x > 5:
raise Exception('x不能大于5。x的值为:{}'.format(x))
---------------------------
输出结果:
raise Exception('x不能大于5。x的值为:{}'.format(x))
Exception: x不能大于5。x的值为:10
raise 需要指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。
自定义异常
在Python中可以通过创建一个新的异常类来拥有自己的异常。
自定义异常的原因:
- Python提供的内建异常不够用
- 可以预估某个错误的产生
异常类继承自 Exception 类,可以直接继承,或者间接继承:
class MyError(Exception):
pass
如此便可以创建一个新的异常类。比如:
class MyError(Exception):
pass
if __name__ == '__main__':
li1 = [213, 43213, -312, 3412, 41, 313]
for i in li1:
v = 100 / i
print(v)
if v < 0:
# 抛出异常
raise MyError("这批货有问题,做工太差")
输出结果:
v = 100 / i
^
TabError: inconsistent use of tabs and spaces in indentation
总结
本篇介绍了程序的异常处理:
语法错误:
- 缺少起始符号或结尾符号(括号、引号等)
- 缩进错误
- 关键词拼写错误
异常错误:除零错误、名称错误、类型错误、数值错误、索引错误以及属性错误。
还介绍了如何:
捕获异常:try…except…else…工作原理
抛出异常:使用 raise 语句抛出一个指定的异常
自定义异常:异常类继承自 Exception 类,可以直接继承,或者间接继承
class MyError(Exception):
除零错误、名称错误、类型错误、数值错误、索引错误以及属性错误。
还介绍了如何:
捕获异常:try…except…else…工作原理
抛出异常:使用 raise 语句抛出一个指定的异常
自定义异常:异常类继承自 Exception 类,可以直接继承,或者间接继承:
class MyError(Exception):
pass