96. Python基础教程:多个异常的处理方法(2个except语句)

【目录】


【正文】

96. Python基础教程:多个异常的处理方法(2个except语句)

1. 2个except语句练习-分苹果

任务目标写一个模拟幼儿园老师分苹果的小程序,用try...except语句处理可能出现的异常。

最终输出的结果为"X个苹果,平均分给X个小朋友,每人分X个,剩下X个。"

提示:程序至少会遇到2个类型的异常。

【代码示例:96-1】

def division():
    '''功能:分苹果'''
    print("\n===================== 分苹果了 =====================\n")
    apple = int(input("请输入苹果的个数:"))          # 输入苹果的个数
    children = int(input("请输入来了几个小朋友:"))   # 输入小朋友人数
    result = apple//children                        # 计算每人分几个苹果
    remain =apple-result*children                   # 计算余下几个苹果
    print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,
          "个,剩下",remain,"个。")
    
if __name__ == '__main__':
    division()                                      # 调用分苹果的函数

上面的代码是我们之前学的内容,现在我们需要给上面的代码加上一个异常处理机制。

写代码前我们分析该程序可能会有2个异常:

一是除数为0的抛出的ZeroDivisionError异常。

二是苹果和小朋友的数量输入成小数或者不是数据,抛出ValueError异常。

如果程序有多个异常,我们可以在try...except语句中再添加except语句。

或者使用我们上节课学的except (异常类型1,异常类型2,异常类型3...) as 别名:语句。

【代码框架】

try:
# 可能会发生异常的代码块
except (异常类型1,异常类型2,异常类型3…) as 别名:
# 输出异常的具体内容
print(别名)

【代码示例:96-2】

def division():
    '''功能:分苹果'''
    print("\n===================== 分苹果了 =====================\n")
    apple = int(input("请输入苹果的个数:"))        # 输入苹果的个数
    children = int(input("请输入来了几个小朋友:")) 
    result = apple//children                        # 计算每人分几个苹果
    remain =apple-result*children                   # 计算余下几个苹果
    print("%d个苹果,平均分给%d个小朋友,每人分%d个,剩下%d个。" % (apple, children, result,remain )) 
 
if __name__ == '__main__':
    try:                               # 捕获异常
        division()                     # 调用分苹果的函数
    except ZeroDivisionError as e:     # 处理ZeroDivisionError异常
        print("输入错误:",e)           # 输出错误原因
    except ValueError as e:            # 处理ValueError异常
        print("输入错误:",e)           # 输出错误原因

【代码解析】

def division():

division[dɪˈvɪʒn]:除法。

def语句定义一个名为division的函数。

print("\n===================== 分苹果了 =====================\n")

第二行代码打印了一个分隔线的提示信息。

apple = int(input("请输入苹果的个数:"))        # 输入苹果的个数

这里注意如果终端输入的是小数,程序也会报错,因为小数类型的字符串转换成整数需要先转换成浮点数,再转换成整数。

以将字符串"3.3"转换成整数为例:

由于"3.3"是一个浮点数字符串,无法直接转换成整数。可必须先将字符串转换成浮点数,然后再将浮点数转换成整数。

注意:将浮点数转换成整数时,会将小数部分直接舍弃,只保留整数部分。

s = "3.3"
f = float(s)  # 将字符串转换成浮点数
i = int(f)  # 将浮点数转换成整数
print(i)  # 输出结果为3
3

将浮点数转换成整数时,会将小数部分直接舍弃,只保留整数部分。所以最终结果为3。

接收用户输入的苹果个数,并将其转换为整数类型。

children = int(input("请输入来了几个小朋友:")) 

children [ˈtʃɪldrən]:孩子们。

接收用户输入的小朋友人数,并将其转换为整数类型。

result = apple//children                      

result [rɪˈzʌlt]:结果。

计算每个小朋友分到的苹果个数,使用整除运算符//

%是取余数操作符,用于返回除法的余数。

例如,5 % 3 = 2,表示5除以3的余数是2。

//是整除操作符,用于返回两个数相除的整数部分。

例如,5 // 3 = 1,表示5除以3的整数部分是1。

print(5 %  3)
print(5 // 3)

【终端输出】

2
1
remain =apple-result*children             

remain [rɪˈmeɪn]:剩余。

苹果总数-每个小朋友分到的苹果数*小朋友数 = 剩下的苹果个数

print("%d个苹果,平均分给%d个小朋友,每人分%d个,剩下%d个。" % (apple, children, result ,remain ))

这行代码使用了字符串格式化的方式输出一句话。

"%d个苹果,平均分给%d个小朋友,每人分%d个,剩下%d个。" 是一个格式化字符串,其中的%d 表示将要插入一个整数值。

代码中的% (apple, children, result ,remain)表示将 apple、children 、 result、remain 依次插入到格式化字符串中的 %d 的位置上。

假设 apple 的值为10,children 的值为5,result 的值为2,remain的值为0,那么最终输出的结果为"10个苹果,平均分给5个小朋友,每人分2个,剩下0个。"

if __name__ == '__main__':

判断当前模块是否为主模块,即直接运行的模块。

if name == 'main':是Python中的一个常用语句,它的作用是判断当前模块是否作为主程序运行。

如果当前模块是作为主程序运行,那么if name == 'main':后面的代码块将被执行

如果当前模块是被其他模块导入的,那么if name == 'main':后面的代码块将不被执行

这样设计的目的是为了让模块既可以作为独立的程序运行,又可以作为其他模块的组件导入使用

可参考文章85. if name == "main"的作用和原理(适合小白)

try: 

捕获异常语句的关键字。

division()

调用分苹果的函数。

try 后接可能出现错误的代码块。

division()就表示可能出现错误的代码块。

【调用函数的语法】

函数名(参数1, 参数2, ...)

其中,函数名是要调用的函数的名称,参数是传递给函数的值或变量。

except ZeroDivisionError as e:     # 处理ZeroDivisionError异常
  • except是关键字。

  • ZeroDivisionError是异常名称。

  • as是关键字,不能更改。

  • e是别名,它记录了异常的具体内容,这里的e你可以根据你自己的喜好来命名。

  • 注意最后要加英文冒号:哦。

print("输入错误:",e) 

输出程序记录的异常内容,根据该内容我们可以排查是什么地方发生了异常。

except ValueError as e:            # 处理ValueError异常
  • ValueError是异常名称。
print("输入错误:",e)                   # 输出错误原因

输入不同的值,终端显示结果如下所示:

【输入苹果的数量为5,小朋友的数量为3】

在这里插入图片描述

【输入苹果的数量为3,小朋友的数量为5】

在这里插入图片描述

【输入苹果的数量为5,小朋友的数量为0】

在这里插入图片描述

integer division or modulo by zero意思是整数除法或取模运算中除数为零。

这个错误通常发生在代码中进行整数除法或取模运算时,除数的值为零,导致无法进行计算。

integer [ˈɪntɪdʒə]:整数。

division[dɪˈvɪʒn]:除法。

modulo [ˈmɒdjʊləʊ]:模。

【输入苹果的数量为5,小朋友的数量为3.3】

在这里插入图片描述

invalid[ɪnˈvælɪd]:无效的。

literal [ˈlɪtərəl]:文本,常量。

base [beɪs]:基础。

输入错误: invalid literal for int() with base 10: ‘3.3’

invalid literal for int() with base 10: '3.3'表示用户输入的字符串是'3.3',而int()函数无法将这个字符串解析为一个有效的整数。

注意小数类型的字符串转换成整数需要先转换成浮点数,再转换成整数。

【输入苹果的数量为R】

在这里插入图片描述

invalid literal for int() with base 10: 'R'表示用户输入的字符串是’R’,而int()函数无法将这个字符串解析为一个有效的整数。

输入错误: invalid literal for int() with base 10: ‘R’

2. except (异常类型1,异常类型2) as 别名

除了多个except语句,我们还可以用except (异常类型1,异常类型2) as 别名的方式改写上面的代码。

【代码示例:96-3】

def division():
    '''功能:分苹果'''
    print("\n===================== 分苹果了 =====================\n")
    apple = int(input("请输入苹果的个数:"))        # 输入苹果的个数
    children = int(input("请输入来了几个小朋友:")) 
    result = apple//children                        # 计算每人分几个苹果
    remain =apple-result*children                   # 计算余下几个苹果
    print("%d个苹果,平均分给%d个小朋友,每人分%d个。" % (apple, children, result)) 
    
if __name__ == '__main__':
    try:                               # 捕获异常
        division()                     # 调用分苹果的函数
    except (ZeroDivisionError,ValueError)as e:     
        print("输入错误:",e)           # 输出错误原因

【代码解析】

except (ZeroDivisionError,ValueError)as e:     
    print("输入错误:",e)           # 输出错误原因
  • except是关键字。

  • except语句后面使用一对英文圆括号()将可能出现的异常名称括起来,多个异常名称之间用英文逗号,分隔。

  • ZeroDivisionError异常名称。

  • ValueError异常名称。

  • as是关键字,不能更改。

  • e是别名,它记录了异常的具体内容,这里的e你可以根据你自己的喜好来命名。

  • :注意最后要加英文冒号哦。

  • print(e)输出程序记录的异常内容,根据该内容我们可以排查是什么地方发生了异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值