错误和异常
错误
错误: 错误代表的是在运行代码之前就可见(不是指的写代码的人可见,而是指python解释器可见)的问题程序不运行,直接报出错误, 只能在运行前进行修改。
常见错误: SyntaxError: invalid syntax
异常
异常: 程序运行期间遇到了问题, 报出错误在程序运行期间遇到了异常之后,如果异常不被处理或者不能处理,程序会向Python解释器抛出异常,Python解释器如果接收到了异常,那认为程序异常结束(exit code 1)。
异常处理的操作:我们去捕获异常,然后去处理(程序自己去做的)那么Python解释器,就接收不到异常,意味着程序不会异常终止。
异常处理的语法
常见类型:
ZeroDivisionError
NameError
KeyError
IndexError
语法:
一.异常处理的语法:
try:
要执行的语句 #可能出现异常的语句
except: #捕获异常
执行异常处理的语句
上面的语句有省略:
输入:print(111)
try:
1 / 0
except (Exception):
print("division by zero")
print(222)
结果:111
division by zero
222
注意:
例子: ZeroDivisionError 是 ArithmeticError的儿子
ArithmeticError 是 Exception的儿子
假设: ZeroDivisionError他犯了错,
1.它可以自己承担 ZeroDivisionError
2.可以让他的父亲承担 ArithmeticError
3.可以让他的爷爷承担 Exception
如果你遇到了异常,尽量直接使用它自己来承担错误,要精准的捕获异常
二.异常处理的复杂语句
try:
要执行的语句
except ExceptionType1:
处理ExceptionType1的语句
except ExceptionType2:
处理ExceptionType2的语句
except ExceptionType3:
处理ExceptionType3的语句
......
例子:
try:
1 / 0
list_data = [1, 2, 3]
list_data[3]
dict_data = {1: 2}
dict_data[3]
test
except IndexError:
print("Index")
except KeyError:
print("Key")
except NameError:
print("Name")
except ZeroDivisionError:
print("Zero")
结果:
Index
执行的顺序:
1.执行try中的语句,若去执行 1 / 0, 他会抛出一个ZeroDivisionError异常
2.去执行异常捕获,他是顺序去执行:
先去第一个except, 如果可以捕获异常,那么就直接结束了
如果捕获不成功(异常类型不匹配),那么继续去执行下一个except
直到匹配成功(捕获成功), 如果except都不能捕获抛出异常
那么直接抛给Python解释器,程序异常结束
语法格式有什么用途:
1.我们在写代码不能都是可能抛出的语句,所以为了保证程序的健壮性,才这样写。因为我们要确保的是,我们运行程序保证代码轻易报错,所以预知哪些会报错某种操作的时候,只会有一种报错。
三.加else的语法:
try:
要执行的语句
except ExceptionType1:
处理ExceptionType1的语句
except ExceptionType2:
处理ExceptionType2的语句
else:
在不抛出任何异常的情况下,去执行的语句
输入:
try:
print(111)
data = 0
except ZeroDivisionError:
print("Zero")
except IndexError:
print("Index")
else:
print("No Error")
四.主动去抛出异常的语法:
raise ExceptionType
# 如果后面有需要的话,也可以自定去定义一个异常类型
# 重命名 使用 as
输入:
try:
1 / 0
except ZeroDivisionError as zde:
print(zde)
结果:
division by zero