异常处理
在程序运行过程中,总会遇到各种各样的错误。
- 有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这种错误通常称之为bug,bug是必须修复的。
- 有的错误是用户输入造成的,比如让用户输入email地址,结果得到一个空字符串,这种错误可以通过检查用户输入来做相应的处理
- 还有一类错误是完全无法在程序运行过程中预测的,比如写入文件的时候,磁盘满了,写不进去了,或者从网络抓取数据,网络突然断掉了。这类错误也称为异常,在程序中通常是必须处理的,否则,程序会因为各种问题终止并退出。
- Python内置了一套异常处理机制,来帮助我们进行错误处理
错误类型
Python中的错误可以分为两种:语法错误和异常
其中主要的有:
语法错误
代码编译时的错误,不符合Python语言规则的代码会停止编译并返回错误信息。
- 缺少起始符号或结尾符号(括号、引号等)
![语法1.png](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fimg.picui.cn%2Ffree%2F2024%2F07%2F17%2F66975e4680f3c.png&pos_id=img-VmRTqdRc-1721199253030%29)
- 缩进错误
![语法2.png](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fimg.picui.cn%2Ffree%2F2024%2F07%2F17%2F66975ea2de402.png&pos_id=img-gV3H4atJ-1721199283041%29)
- 关键词拼写错误
![语法3.png](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fimg.picui.cn%2Ffree%2F2024%2F07%2F17%2F66975f0d19be9.png&pos_id=img-lxwtmRWI-1721199313045%29)
异常错误
异常错误一共有六种典型的异常:
除零错误
除零错误(ZeroDivisionError):除数为0。
![除0.png](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fimg.picui.cn%2Ffree%2F2024%2F07%2F17%2F66975ff07bdb9.png&pos_id=img-WNxJG5Fs-1721199343053%29)
名称错误
名称错误(NameError):变量使用前未进行申明或者初始化 。
![名称.png](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fimg.picui.cn%2Ffree%2F2024%2F07%2F17%2F66975ff0ab191.png&pos_id=img-HPGLGRPw-1721199373059%29)
类型错误
类型错误(TypeError):某些函数或者方法只适用于特定的数据类型,如果 对数据类型的操作不当,就会产生类型错误 。
![类型.png](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fimg.picui.cn%2Ffree%2F2024%2F07%2F17%2F669760910b474.png&pos_id=img-KzKbbNhR-1721199403062%29)
数值错误
数值错误(ValueError):在输入类型正确的情况下,具体输入值错误 。
![数值.png](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fimg.picui.cn%2Ffree%2F2024%2F07%2F17%2F6697609108747.png&pos_id=img-uUywzGhs-1721199433067%29)
索引错误
索引错误(IndexError):超出序列长度的索引操作。
![索引.png](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fimg.picui.cn%2Ffree%2F2024%2F07%2F17%2F669761331c330.png&pos_id=img-mD9n1CW3-1721199463069%29)
属性错误
属性错误(AttributeError):方法或者属性不适用该对象 。
![属性.png](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fimg.picui.cn%2Ffree%2F2024%2F07%2F17%2F6697613336e7b.png&pos_id=img-icuBVJvB-1721199493073%29)
捕获异常
高级语言通常都内置了一套错误处理机制,Python也不例外:在Python中可通过try…except…else…finally…机制捕获异常并进行处理。
![捕获.png](https://img-blog.csdnimg.cn/img_convert/8c29778a1e94dba6aaabf8d078b0c9be.png)
比如:
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 语句抛出一个指定的异常:
![抛出异常.png](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fimg.picui.cn%2Ffree%2F2024%2F07%2F17%2F669764e04566c.png&pos_id=img-ACzFy79A-1721199544201%29)
例如执行以下代码会触发异常:
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
-