Python异常处理

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值