014 Python中的 异常 Exception

一、异常是什么

什么是错误

指由于逻辑或语法等导致一个程序无法正常执行的问题

特点

有些错误是无法预知的

什么是异常

指程序出错时标识的一种状态

当异常发生时,程序不会再向下执行,而转去调用此函数的地方待处理此错误并恢复为正常状态

作用

用作信号,通知上层调用者有错误需要处理

二、try语句

语法

1.try-except 语句

2.try-finally 语句

2.1 try-except语句

语法

try

        可能触发异常的语句

except  错误类型1 [as 变量1]:

        异常处理语句1

except  错误类型2 [as 变量2]:

        异常处理语句2

except  (错误类型3, 错误类型 4) [as 变量3]:

        异常处理语句3

。。。

except

        异常处理语句other(收集以上未列出的异常)

else

        未发生异常时,要执行的语句

finally

        最终语句(必须要执行的语句)

作用

尝试捕获异常,将程序转为正常状态并继续执行

示例 try_except.py

    try和  “except  错误类型”  是如何捕获异常的?

#try_except.py
# 示范 try_except语句的用法



def div_apple(n):
    print('%d苹果分给几个人' % n)
    s = input('请输入人数:')
    cnt = int(s)        #此处可能触发ValueError类型的错误
    result = n / cnt    ##此处可能触发ZeroDivisionError类型的错误
    print('每个人分了%d个苹果'% result)

try:
    div_apple(10)   #此函数可能会触发错误,分苹果失败
except ValueError:  #cnt处触发错误会和ValueError进行匹配,匹配成功,就执行下一条语句
    print('分苹果失败,程序已捕获通知,并转为正常状态')
except ZeroDivisionError:
    print('没有人来,把苹果拿回来吧')

print('程序正常退出')

示例 try_except2.py

        如何用except 收集未列出的异常?

#try_except2.py
# 示范 try_except语句的except用法



def div_apple(n):
    print('%d苹果分给几个人' % n)
    s = input('请输入人数:')
    cnt = int(s)       
    result = n / cnt    
    print('每个人分了%d个苹果'% result)

try:
    div_apple(10)  
except ValueError:  
    print('分苹果失败,程序已捕获通知,并转为正常状态')
except :  #捕获其他类型的错误,且只能写在最后
    print('其他类型的错误已捕获')

print('程序正常退出')

示例 try_except3.py

#try-except3.py
# 示范try-except的as用法

def div_apple(n):
    print('%d苹果分给几个人' % n)
    s = input('请输入人数:')
    cnt = int(s)       
    result = n / cnt    
    print('每个人分了%d个苹果'% result)

try:
    div_apple(10)  
except ValueError as e:  #e绑定错误信息,记录错误是为什么错
    print('分苹果失败,程序已捕获通知,并转为正常状态')
    print('错误值为:',e)
    #会打印出:
    #错误值为: invalid literal for int() with base 10: 'aa'
except :  
    print('其他类型的错误已捕获')

print('程序正常退出')

示例 try_except_else.py

#try-except_else.py
# 示范try-except的else用法

def div_apple(n):
    print('%d苹果分给几个人' % n)
    s = input('请输入人数:')
    cnt = int(s)       
    result = n / cnt    
    print('每个人分了%d个苹果'% result)

try:
    div_apple(10)  
except ValueError:  
    print('分苹果失败,程序已捕获通知,并转为正常状态')
except :  
    print('其他类型的错误已捕获')
else:
    print('分苹果时没有发生异常')#没有出现任何异常时,执行此语句
print('程序正常退出')


# 输出结果:

# 10苹果分给几个人
# 请输入人数:2
# 每个人分了5个苹果
# 分苹果时没有发生异常
# 程序正常退出

示例 try_except_finally.py

#try_except_finally.py


def div_apple(n):
    print('%d苹果分给几个人' % n)
    s = input('请输入人数:')
    cnt = int(s)       
    result = n / cnt    
    print('每个人分了%d个苹果'% result)

try:
    div_apple(10)  
except ValueError: 
    print('分苹果失败,程序已捕获通知,并转为正常状态')
else:
    print('分苹果时没有发生异常')
finally:    #任何情况下都会执行,不管有没有异常
    print('我一定会执行的!')
print('程序正常退出')


#打印结果:

#10苹果分给几个人
# 请输入人数:3
# 每个人分了3个苹果
# 分苹果时没有发生异常
# 我一定会执行的!
# 程序正常退出

2.2 try-finally语句

语法

try

        可能触发异常的语句

finally

        一定要执行的最终语句

说明

1.finally子句不可以省略

2.一定不存在except子句

作用

通常用try-finally语句来做触发异常时必须要处理的事情,无论异常是否发生,finally子句都会被执行

try-finally语句不会改变程序的状态(正常/异常)

示例 try-finally.py

#try-finally.py

def fry_egg():
    try:
        print('打开天然气 ...')
        try:
            count = int(input("请输入鸡蛋个数:"))
            print("共煎了",count,"蛋")
        finally:
            print("关闭天然气")
    except ValueError:
        pass



fry_egg()

三、raise语句

作用

触发一个错误,让程序进入异常状态

语法

raise 异常类型

raise 异常对象

示例 raise.py

        示意 raise 异常类型

#raise.py


#示范raise语句来触发异常

def make_exception():
    print("begin")

    #触发ValueError类型的异常并进入异常状态
    #无中生有一个ValueError
    raise ValueError   

    print("end")

try:
    make_exception()
    print("make_exception调用结束")

except ValueError:
    print('try里出现两ValueError错误通知,已捕获!!')



#有raise,打印结果:
# begin
# try里出现两ValueError错误通知,已捕获!!


#无raise,打印结果:
# begin
# end
# make_exception调用结束

示例 raise2.py

        示意 raise 异常对象

#raise2.py


#示范raise语句,错误对象

def make_exception():
    print("begin")

    #自己制造了一个错误对象,用err绑定
    #如果没抛出去,就不会异常.
    #可以用raise抛出
    err = ValueError("这是我自己定义的一个错误")
    raise err

    print("end")

try:
    make_exception()
    print("make_exception调用结束")

except ValueError as e:
    print('try里出现了ValueError错误通知,已捕获!!')
    print('接受的异常通知是:',e)
    #打印出错误信息,即line12 绑定的信息


#打印结果:
# begin
# try里出现了ValueError错误通知,已捕获!!
# 接受的异常通知是: 这是我自己定义的一个错误

四、assert语句(断言语句)

语法

assert 真值表达式,错误数据(通常是字符串)

作用

当真值表达式为False时,用错误数据创建一个AssertionError类型的错误,并进入异常状态

等同于:

   if 真值表达式 == False:

        raise AssertionError(错误数据)

示例 get_score.py

#get_score.py

#示范assert语句的用法

def get_score():
    s = int(input("请输入学生成绩:"))

    #用assert语句来断言score是否在0-100之间
    assert 0 <= s <= 100, '用户输入的整数不在0-100之间'
    return s

try:
    score = get_score()
    print("学生成绩为:", score)
except ValueError:
    print("用户输入的成绩无法转化为整数")
except AssertionError as err:
    print("发生了断言错误,原因是:", err)


#AssertionError的打印结果为:
# 请输入学生成绩:8598
# 发生了断言错误,原因是: 用户输入的整数不在0-100之间


#err绑定的是assert后面的字符串,即错误信息

五、异常语句小结

try-except

接收异常通知,捕获异常,处理错误,将状态改为正常状态

try-finally

执行一定要执行的语句

raise

发送异常通知,将程序转为异常状态(进入异常流程)

assert

根据条件来触发AssertionError类型的异常

with

以后学

 

 

为什么要用异常处理机制?

1.在程序调用层数较深时,向主调函数传递错误信息需要层层return返回比较麻烦,所以用异常处理机制来解决此类问题

示例 exception_sample.py

# exception_sample.py

#只需要看明白就行了


def f1():
    print("开始建房子,打地基")
    err = ValueError("打地基挖出古董")
    return err
    print("完成打地基工作")
    return "地基完成"

def f2():
    print("开始建设地上部分")
    err = ValueError("规划要建高压线")
    return err
    print("地上部分建完...")
    return "地上完成"

def f3():
    '''建地基'''
    r1 = f1()
    if type(r1) is not str:
        return r1
    #建地上部分
    r2 = f2()
    if type(r2) is not str:
        return r2

    return r1 + r2

def built_house():
    '''接项目的人'''
    return f3()



h = built_house()  #建房子函数,返回一个房子对象

print(h)




#冗余代码:f1里面的return err 和 相应的 f3里面对f1判断;
# f2同理

 

 

 

 

 

 

 

 

 

 

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值