一、错误&异常
对比 | 错误 | 异常 |
---|---|---|
产生场景 | 编译时 | 运行时 |
例如 | 语法错误SyntaxError(IndentationError缩进错误) 逻辑错误 | 名称错误NameError 零除错误ZeroDivisionError |
处理 | 语法错误根据提示修正 逻辑错误不易发现,协助方式有调试器、加日志、编写测试用例、自定义异常、静态分析工具等 | 按需要,捕获异常 |
二、常见异常
异常 | 产生原因 | 例如 |
---|---|---|
名称错误NameError | 未声明时 | #未声明过变量a print(a) #NameError #未声明过函数b() b() #NameError |
零除错误ZeroDivisionError | 除数为0时 | a = 1 b = 0 a/b #ZeroDivisionError |
类型错误TypeError | 非预期类型时 | 'we'+3 #TypeError,参与运算类型不匹配,字符串+字符串,或者数值+数值 def a(): pass a(23) #TypeError,函数形实参数列表不匹配,调用方法也一样 class A: def a(self): pass x = A() x.a(123) #TypeError,函数形实参数列表不匹配 t = (1,2) t[1] = 5 #TypeError,不可变数据类型,修改时报类型错误 |
数值错误ValueError | 类型匹配,值非预期 | int('werwe') #ValueError,int()方法入参字符串类型没问题,但是值应该是数值组成的字符串 |
索引错误IndexError | 索引越界 | li = [1,2] li[5] #IndexError,li列表索引只有0,1,访问5不在可访问索引范围 |
键错误KeyError | 字典中不能存在该key | d = {'k1':v1,'k2':v2} d['k4'] #KeyError,字典key中不存在k4 |
描述错误AttributeError | 引用实例没有声明该属性或方法 | class A: pass x = A() x.a #AttributeError,类A未声明属性a x.run() #AttributeError,类A未声明方法run() |
-
TypeError&ValueError
对比 TypeError ValueError 例子 'hello'+1 int('hello') 原因 +运算符,用于拼接两个字符串,或者对两个数值做加法。
当字符串在前,语法上‘+’后应该是字符串,但是为int类型,所以报类型错误。
当数值在前时,语法上'+'后应该是数值,如果为字符串,也会报类型错误。
另外,调用函数名存在,但实参与形参列表不匹配时,也会报类型错误。例如:
def run():
pass
run(1,2,3) #TypeError
int()方法接收字符串类型实参没有问题,但是对值有要求,必须是数值组成的字符串。
当接收了字母组成的字符串时,报值错误。
-
NameError&TypeError&AttributeError
对比 NameError TypeError AttributeError 例子 class A:
def a(self):
print(c)
x = A()
x.a()
class A:
def a(self):
pass
x = A()
x.a(1)
class A:
pass
x = A()
x.a()
原因 类A有定义a()方法,但是a()方法中的c未声明过,报名称错误 类A有定义a()方法,但是声明时形参只有一个对象自身,调用时有两个实参(对象自身+1),参数列表不匹配,报类型错误 类A无方法a()
变量x调用方法a(),报描述错误
三、异常处理
-
捕获异常语法格式
''' 捕获异常语法格式 ''' try: pass # 可能出现异常的代码块 except NameError: # 指定一个错误类型,进行捕获 pass # 处理逻辑代码块 except (ValueError,TypeError): # 指定多个错误类型,作为元组进行捕获 pass # 处理逻辑代码块 except: # 捕获所有错误类型 pass # 处理逻辑代码块 else: # 无异常捕获时,执行分支 pass # 逻辑代码块 finally: # 最终执行分支,正常逻辑或者异常逻辑执行返回前 pass # 逻辑代码块
-
抛出异常语法格式
''' 抛出异常语法格式 ''' a = -1 if a < 0: raise ValueError('不能为负数')
【执行结果】
-
自定义异常
''' 自定义异常:需要继承Exception ''' class My_Exception(Exception): def __init__(self,message): self.message = message print('自定义异常:',self.message) try: raise My_Exception('我的错') # 初始化自定义异常实例,并抛出 except: #捕获所有异常 print('有错误抛出') finally: #最后必然执行 print('执行结束')
【执行结果】
四、总结关键字
关键字 | 功能 | 例子 |
---|---|---|
try | 跟可能出现异常的代码块 | try: pass |
except | 不指明异常时,表示捕获所有异常; 指明异常时,表示捕获指定异常(指定多个时,用元组形式表示) | try: pass except A: pass except (A,B): pass except: pass |
else | 无异常时,执行该分支 | try: pass #无异常抛出 except: pass else: pass |
finally | 最终执行分支,无论正常或者异常,结束前必执行 | try: pass except: pass else: pass finally: pass |
raise | 主动抛出异常 | raise 异常对象 |