Python中的异常处理

1、异常

1.1 概念引入

什么是错误:  # 会引起程序的异常
错误是由于逻辑或者语法等导致一个程序无法正常执行的问题
-------------------------------------------------------------------------
什么是异常:  # 错误发生时的一种状态
异常是指程序出错时标识的一种状态
当异常发生时,程序不会在向下执行,而转去调用此函数的地方待处理错误并恢复正常状态

1.2 作用

用作信号,通知上层调用者有错误产生需要处理
在程序调用层数较空时,想主调函数传递错误信息需要层层return返回比较麻烦,用异常处理机制就相对简单很多,代码量大大减少。

2、处理异常语句 try-except 语句

2.1 try语句的两种用法

try-except 语句
try-finally语句

2.2 try-except 语法

try:
	可能触发的异常
except 错误类型1 [as 变量1]:
	异常处理语句1
except 错误类型2 [as 变量2]:
	异常处理语句2
except (错误类型3,错误类型4):
	异常处理语句3
	....
except:
	其他异常处理语句
else:
	未发生错误执行的语句  ,  发生错误不执行
finally:
	最终语句   ,  无论正常还是异常都一定会执行 

2.3 作用

尝试捕获异常(接受异常通知),将程序转为正常状态并继续执行

2.4 说明

as 子句用于绑定错误对象的变量,可以省略		eg :except ValueError as err
except 子句可以有一个或多个,但至少有一个
else 子句最多只能有一个,但也可以省略不		# 只有在try语句内部没错误的时候执行,有错误不执行
finally 子句最多只能有一个,但也可以省略不写	# finally语句无论怎么样都一定会执行

2.5 示例1

def div_apple(n):
    print("%d个苹果你想分给几个人?"%n)
    s = input('请输入人数:')
    cnt = int(s)    # 可能触发 ValueError 错误进入异常
    result= n/cnt   # 可能触发 ZeroDivisionError错误进入异常
    print("每个人分了",result,"个苹果")
try:
    div_apple(10)
    print("苹果分配完成!")
except ValueError:
    print("在try语句内部发生了值错误,已处理并转为正常状态!")
except ZeroDivisionError:
    print("不能分配给0个人!")
print("程序正常退出")

示例2:

# 捕获异常,数输入1~100的数并输出,捕获:超出范围或者类型错误,返回 0
# 也可以在函数外捕获异常 
def get_score():
    try:
        num = int(input("请输入一个数:"))
        if 0<=num<=100:
            return num
        else:return 0 
    except ValueError:
        return 0
score = get_score()
print(score)

3、处理异常语句 try-except语句

3.1 语法:

try :
    可能触发异常的语句
finally:
    最终语句

3.2 说明:

finally子句不可以省略
一定不存在except子句

3.3 作用:

通常用try-finally 语句来做触发异常时必须要处理的事情,无论异常是否发生,finally字句都会执行
try-finally语句不会更改程序的(正常/异常状态)

3.4 示例:

def fry_egg():
    print("打开天然气...")
    try:
        count = int(input("请输入煎几个鸡蛋:"))
        print("完成煎鸡蛋,共煎了%d个鸡蛋"%count)
    finally:
        print("关闭天然气...")
try:
    fry_egg()
except:
    print("程序出现异常,已转为正常状态")
print("程序正常退出")

4、try 语句嵌套示例

4.1 定义:try语句嵌套是指一个try语句嵌套在另一个try语句内使用

4.2 示例1

x = 100
y = 200
try:
    save_x = x
    save_y = y
    try:
        print('x = {},y = {}'.format(x,y))
        x = int(input("x="))
        y = int(input("y="))
        print("打印x y,打印完成后x,y恢复原值")
        print('’x = {},y = {}'.format(x,y))
    finally: 
        x = save_x
        y = save_y
finally:
    pass
print('x = {},y = {}'.format(x,y))

4.3 示例2

# 此示例示意try语句嵌套,在内层的try语句如果已经把状态转为正常状态,则外层的try语句将收不到错误通知
try:
    try:
        n = int(input("请输入整数:"))
    except ValueError:
        print("在内层try出现值错误,已转为正常状态")
    else:
        print("内层try没有出现异常")
except:
    print("外层的try语句接到异常通知,已处理并转为正常状态")
else:
    print("外层的try语句没有出现异常")

5、raise语句

5.1 作用:

触发一个错误,让程序进入异常状态
发送错误通知给调用者

5.2 语法:

raise 异常类型
或
raise 异常对象
或
raise  #重新出发上一次异常

5.3 示例1:

def make_except():
    print("开始")
    try:
        raise ValueError   # 故意发送一个错误通知
    except:
        print("接到异常通知,已处理并转为正常状态")
    print("调用结束")
try:
    make_except()
except:
    print("接到异常通知,已处理并转为正常状态")
print("程序结束")

5.4 示例2

def make_except():
    print("开始")
    e = ValueError("这是一个故意制作的异常")
    raise e
    print("结束")
try:
    make_except()
except ValueError as err:
    print("接到异常通知,已处理并转为正常状态")
    # 获取错误的原因
    print(err)
print("程序结束")

5.5 示例3

# 写一个get_age()函数用来获取一个人的年龄信息
# 此函数规定与欧诺个户只能输入1~140之间的整数,如果输入其他则直接出发ValueError错误类型来通知调用者
def get_age():
    age = int(input("请输入年龄(1~140):"))
    if age >140 or age <1:
        raise ValueError("用户输入的不是1~140范围内的数字,获取年龄失败!")
    else:
        return age
def main():
    try:
        age = get_age()
        print("用户输入的年龄是:",age)
    except ValueError as err:
        print("发生错误的类型为:",err)
main()

6、assert 语句(断言语句)

6.1 语法:

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

6.2 作用:

当真值表达式为Flase时,用错误数据创建一个AssertionError类型的错误raise出去,并进入异常状态
等同于:
if 真值表达式 == Flase:
    raise AssertionError

6.3 示例:

# 此示例示意assert语句的用法
def get_score():
    s = int(input("请输入学生成绩(1~100):"))
    assert 0<=s<=100,'成绩超出范围!'
    return s
try:
    score = get_score()
    print("学生的成绩为:",score)
except ValueError:
    print("输入数据类型有误!")
except AssertionError:
    print("用户输入的整数不在0~100之间!")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值