文章目录
1、什么是异常
异常是程序发生错误的信号,程序一旦出错就抛出异常,程序的运行随即终止
1.1 异常处理的三个特征
异常的追踪信息
异常的类型
异常的内容
2、为何处理异常
为了增强程序的健壮性,即便是程序运行过程中出错了,也不要终止程序
二是捕捉异常并处理:将出错信息记录到日志内
3、如何处理异常
3.1 语法上的错误: SyntaxError
if 1 >3
print(‘error’)
3.2 逻辑上的错误
TypeError:数字类型无法与字符串类型相加
1+’2’
ValueError:当字符串包含有非数字的值时,无法转成int类型
num=input(">>: ") #输入hello
int(num)
NameError:引用了一个不存在的名字x
x
IndexError:索引超出列表的限制
l=['egon','aa']
l[3]
KeyError:引用了一个不存在的key
dic={'name':'egon'}
dic['age']
AttributeError:引用的属性不存在
class Foo:
pass
Foo.x
ZeroDivisionError:除数不能为0
1/0
3.2’ 针对逻辑上的异常又有两种处理方式
3.2.1 错误发生的条件是可以预知的
age = input(">>: ").strip() # 输入的不是数字就不会出错
age = int(age)
if age > 18:
print("猜大了")
elif age == 18:
print("猜对了")
else:
print("猜小了")
3.2.2 错误发生的条件是不可以预知的
当if判断无法进行排查时产生的问题
if 条件:
服务端会崩溃
try:
被检测的代码块
except 异常类型:
检测到异常,就执行这个位置的逻辑
示例:
try: # 但是会降低程序的可读性
print('start...')
print(x) # 引用了一个不存在的名字,触发异常NameError
print('end...')
except NameError as e: # as语法将异常类型的值赋值给变量e,这样我们通过打印e便可以知道错误的原因
print('异常值为:%s' %e)
print('run other code...')
try:
被检测的代码块
except NameError:
触发NameError时对应的处理逻辑
except IndexError:
触发IndexError时对应的处理逻辑
except KeyError:
触发KeyError时对应的处理逻辑
except Exception as e: # 万能异常
print('可以捕捉到所有异常')
else: # 但是try不能单独和else配合使用,必须要搭配except
如果被检测的代码块没有发生异常则会执行else代码
finally: # 可以与try单独连用,可以不需要except
无论被检测的代码块没有发生异常都会执行finally代码
finally不会处理异常,无论发生什么异常都会执行finally的子代码块
因此应该把被检测代码块中回收系统资源的代码放到这里
补充:with open()函数在子代码块抛出异常的时候会自动停止?
此外try还可以与finally连用,从语法上讲finally必须放到else之后,但可以使用try-except-finally的形式,也可以直接使用try-finally的形式。无论被检测的代码块是否触发异常,都会执行finally的子代码块,因此通常在finally的子代码块做一些回收资源的操作,比如关闭打开的文件、关闭数据库连接等
如果我们想多种类型的异常统一用一种逻辑处理,可以将多个异常放到一个元组内,用一个except匹配
try:
被检测的代码块
except (NameError,IndexError,TypeError):
触发NameError或IndexError或TypeError时对应的处理逻辑
例子:
def convert_int(obj):
try:
res=int(obj)
except (ValueError,TypeError):
print('argument must be number or numeric string')
res=None
return res
convert_int('egon') # argument must be number or numeric string
convert_int({'n':1}) # argument must be number or numeric string