前言:当我们正常运行程序时,一遇到错误异常,程序就会终止,而目前我们不希望遇到异常就退出,或者如果遇到异常希望做特殊处理,而不是退出程序
一、正常程序遇到异常
当我们敲写以下代码,假如我们没有xxw.txt这个文件,就会遇到以下报错
print("start.....")
fp = open("xxw.txt")
print("end")
二、常见异常
1、命名异常
NameError
print(abc)
2、缩进异常
IndentationError
print(“abc”)
3、索引异常
IndexError
lst = [1,2,3]
print(lst[4])
4、语法异常
SyntaxError
if 1>0::
print(“ok”)
5、关键字异常
KeyError
d1 = {“a”:1}
print(d1[“b”])
6、模块异常
AttributueError
import random
random.xxx()
7、值异常
ValueError
int(“abc”)
8、断言异常,常用来测试
AssertionError
num1 = int(input(“please input an number:”))
num2 = int(input(“please input an number:”))
assert num1 > num2
三、异常捕获机制
try...except...
1、异常发生,不终止程序
2、异常发生,做特殊处理
try except 的使用
//最常见且最简易的try except的使用
try:
print("start...")
fp = open("xxw.txt")
print("end..")
except:
print("no such file")
print("end2...")
//可以根据异常的类型进行捕获,并输出错误信息
except Exception:
print("this is exception")
except ZeroDivisionError as e:
print(e)
except ValueError:
print("hello")
print("process end...")
except 可以有多个,匹配到第一个就退出了
四、异常类Exception
exception 是很多异常类的父类,当我们不知到会有什么异常时,可以写exception,例如:
except Exception:
print("this is exception")
except ZeroDivisionError as e:
print(e)
except ValueError:
print("hello")
print("process end...")
tips:
1、如果父类异常捕获放到最前面,就会吞噬所有的子类异常的捕获
2、如果捕获的错误异常与触发的错误异常不一致,程序就捕获不到,然后抛出异常
五、手动抛出异常
手动抛出异常
raise 关键字
raise 异常类
raise 异常类(说明信息)
print("raise start.....")
raise IndexError("超出范围")
print("end raise....")
六、else结构 finally结构
else 结构 没有任何异常发生的时候执行的
finally 不管有没有异常,不管异常有没有被捕获,都执行(写到异常捕获机制最后)