1,异常就是程序运行错误时发出的信号 在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止
2.异常的种类: 1.语法异常: 这类异常应该在程序执行前改正,如忘写分号,括号等print('start....' 2.逻辑异常: 异常处理主要处理逻辑异常
3.一个异常分为三部分 1.异常的追踪信息 2.异常的类型 3.异常的值
例: Traceback (most recent call last): File"D:/Python/课程讲解/day24/异常处理.py", line 21, in <module> asd NameError: name 'asd' is not defined
#Traceback ===>异常的追踪信息 #NameError===>异常的类型 #name 'asd' is notdefined ====>异常的值
常见的异常类型: AttributeError试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxErrorPython代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError 传入对象类型与要求的不符合 UnboundLocalError试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
''' #异常处理的语法: try只是监测代码块,当有异常发生时,跳到except中判断是否有对应的异常类型; 有则运行对应的异常处理逻辑,没有则抛出异常,结束程序;和if判断类似 运行完处理逻辑后,不会跳回try的代码块,接着执行后面的代码
#单分支 try: #代码 except 异常类型 #异常处理逻辑 except 异常类型 #异常处理逻辑 except 异常类型 #异常处理逻辑
#异常合并 try: #代码 except (异常类型,异常类型,....) #异常处理逻辑
#万能异常处理;一般那放在最后,类似于if中的else except Exception #异常处理逻辑
#处理异常的值
#as ,将异常的值赋值给变量 except 异常类型 as 变量名 print(变量名)
try....except ..else:.... 在被监测的代码块没有出现异常,会执行else中的代码
try: #代码 except 异常类型 #异常处理逻辑 else: #代码 try中没有出现异常是会执行
try:...except...finally.... 被监测代码无论有没有异常,都会执行finally中的代码 finally中可以执行一些回收系统资源的代码,避免程序异常结束而没有释放调用的系统资源
书写顺序: try:...except....else.....finally....
#主动触发异常 raise 异常类型(异常的值)
raiseTypeError("异常的值")
#断言 assert 条件 只有值大于0时,在执行后续代码,否则就抛出异常,结束程序
#自定义异常
BaseException异常类型的父类
class异常类名(BaseException): def __init__(self,msg,user): self.msg=msg self.user=user def __str__(self): return"<%s:%s>"%(self.msg,self.user)
raise异常类名("注册失败","teacher") raise相当于print打印,会触发类中__str__()方法
'''
try: x=1 y print(y) l=[] # l[3] except NameError as a: print(a) except Exception as a: print(a) else: print("没有错误") finally: print("无论有没有错误都会执行")
#主动触发异常 # raiseNameError("异常的值") #===>NameError: 异常的值
# 断言
assert 3 print("qqq")#===>qqq assert 1==1 print("qqq")#===>qqq assert 1==2 print("qqq")#===>AssertionError
##自定义异常 classRegisterError(BaseException): def __init__(self,msg,user): self.msg=msg self.user=user def __str__(self): return"<%s:%s>"%(self.msg,self.user)
raiseRegisterError("注册失败","teacher") #===>__main__.RegisterError:<注册失败:teacher> # raise相当于print打印,会触发类中__str__()方法
|