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

news2024/9/27 19:18:17

【目录】

文章目录

  • 96. Python基础教程:多个异常的处理方法(2个except语句)
    • 1. 2个except语句练习-分苹果
    • 2. except (异常类型1,异常类型2) as 别名

【正文】

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)输出程序记录的异常内容,根据该内容我们可以排查是什么地方发生了异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/809140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP网络通信编程之netstat

【netstat指令】 【说明】 (1)Listening 表示某个端口在监听 (2)如果有一个外部程序(客户端)连接到该端口,就会显示一条连接信息 (3)指令netstat -anb 可以参看是那个…

分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离(二)

说明:如果实现了docker部署mysql并完成主从复制的话再继续,本篇文章主要说明springboot配置实现Shardingjdbc进行读写分离操作。 如果没实现docker部署mysql实现主从架构的话点击我 Shardingjdbc配置介绍(版本:5.3.2)…

04-树6 Complete Binary Search Tree(C++)

思路 先排序&#xff08;冒泡排序&#xff09; 用数组建一棵空树&#xff08;用数组&#xff0c;填好左右儿子&#xff09; 中序遍历填数&#xff08; Tree::travIn() &#xff09; 顺序输出即为层次遍历&#xff08; Tree::travLevel() &#xff09; code # include <…

三步问题(力扣)n种解法 JAVA

目录 题目&#xff1a;1、dfs:2、dfs 备忘录&#xff08;剪枝&#xff09;&#xff1a;&#xff08;1&#xff09;神器 HashMap 备忘录&#xff1a;&#xff08;2&#xff09;数组 memo 备忘录&#xff1a; 3、动态规划&#xff1a;4、利用 static 的储存功能&#xff1a;&…

C++ - stack 和 queue 模拟实现 -认识 deque 容器 容器适配器

stack模拟实现 用模版实现 链式栈 和 顺序栈 对于stack 的实现&#xff0c;有两种方式&#xff0c;一种是连续空间存储的顺序栈&#xff0c;一种是不连续空间存储的链式栈&#xff0c;在C当中如果要使用两种不同的栈的话&#xff0c;实现方式是不一样的&#xff0c;他们的底层逻…

Transformer背景介绍

目录 Transformer的诞生Transformer的优势Transformer的市场 Transformer的诞生 论文地址 Transformer的优势 Transformer的市场

【MySQL】事务管理

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《零基础入门MySQL》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录 &#x1f449;CU…

使用mediapipe训练手指数字识别

mediapipe手指数字识别 本文是从0开始创建一个识别手势的机器学习模型&#xff0c;为了识别手势&#xff0c;采用mediapipe模型&#xff0c;这个模型会返回手指的位置&#xff0c;之后再通过训练一个模型将这些位置分类得到手势 一、导入依赖 import cv2 import numpy as np…

分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离(一)

说明&#xff1a;请先自行安装好docker再来看本篇文章&#xff0c;本篇文章主要实现通过使用docker部署mysql实现读写分离&#xff0c;并连接数据库测试。第二篇将实现使用Shardingjdbc实现springboot的读写分离实现。 基于Docker去创建Mysql的主从架构 #创建主从数据库文件夹…

小黑子—JavaWeb:第四章 Request与Response

JavaWeb入门4.0 1. Request(请求)& Response (响应)2. Request2.1 Request 继承体系2.2 Request 获取请求数据2.2.1 通用方式获取请求参数2.2.2 IDEA模板创建Servlet2.2.3 请求参数中文乱码处理2.2.3 - I POST解决方案2.2.3 - II GET解决方案 2.3 Request 请求转发 3. Resp…

常见网关对比

常见网关对比 目前常见的开源网关大致上按照语言分类有如下几类&#xff1a; Nginxlua &#xff1a;OpenResty、Kong、Orange、Abtesting gateway 等 Java &#xff1a;Zuul/Zuul2、Spring Cloud Gateway、Kaazing KWG、gravitee、Dromara soul 等 Go &#xff1a;Janus、fa…

简单学会MyBatis原生API注解

&#x1f600;前言 本篇博文是关于MyBatis原生API&注解的使用&#xff0c;希望能够帮助到你&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您…

2023深圳杯数学建模B题

B题 电子资源版权保护问题 版权又称著作权&#xff0c;包括发表权、署名权、修改权、保护作品完整权、复制权、发行权、出租权、展览权、表演权、放映权、广播权、信息网络传播权、摄制权、改编权、翻译权、汇编权及应当由著作权人享有的其他权利。 在计算机网络广泛应用的今…

39.手机导航

手机导航 html部分 <div class"phone"><div class"content"><img class"active" src"./static/20180529205331_yhGyf.jpeg" alt"" srcset""><img src"./static/20190214214253_hsjqw…

基于 ThinkPHP 5.1(稳定版本) 开发wms 进销存系统源码

基于ThinkPHP 5.1&#xff08;LTS版本&#xff09;开发的WMS进销存系统源码 管理员账号密码&#xff1a;admin 一、项目简介 这个系统是一个基于ThinkPHP框架的WMS进销存系统。 二、实现功能 控制台 – 权限管理&#xff08;用户管理、角色管理、节点管理&#xff09; – 订…

BUUCTF——reverse3 适合新手的关于base64加密算法代码的分析

作为一个逆向小白&#xff0c;学了点加密算法就来BUU找点乐子&#xff0c;前7题蛮简单的&#xff0c;然后做到了reverse3&#xff0c;典型的base64加密算法&#xff0c;让我折腾了好久&#xff0c;写篇博客记录一下 顺便说下很多博客并没有对这里的加密算法进行代码上的分析&a…

秋招备战笔试Day1

目录 单选 1. 在 Java 中&#xff0c;存放字符串常量的对象属于&#xff08; &#xff09;类对象。 2.已知如下类定义&#xff1a; 如下哪句可以正确地加入子类中&#xff1f; 3. 下列选项中属于面向对象编程主要特征的是&#xff08;&#xff09; 4.关于下列程序段的输出结…

并发编程可能出现的核心问题

2.1非可见性 如果主内存里有个静态变量flagfalse&#xff0c;然后线程A和B在工作内存都需要操作flag&#xff0c;线程A是while(!false){}&#xff0c;而线程B将flag改为true&#xff0c;但是由于线程A和线程B之间工作内存互相不可见&#xff0c;线程A就会陷入死循环。 2.2指令…

排序链表——力扣148

文章目录 题目描述法一 自顶向下归并排序法二&#xff09;自底向上归并排序 题目描述 题目的进阶问题要求达到 O(nlogn) 的时间复杂度和 O(1) 的空间复杂度&#xff0c;时间复杂度是 O(nlogn) 的排序算法包括归并排序、堆排序和快速排序&#xff08;快速排序的最差时间复杂度是…

【RabbitMQ(day2)】默认(直连)交换机的应用

文章目录 一、第一种模型&#xff08;Hello World&#xff09;二、第二种模型&#xff08;work queue&#xff09;自动确认机制的后果和公平分配 三、阐述默认交换机 这篇博客是以下资料学后的总结&#xff1a; 不良人的RabbitMQ的教学视频 官方启动教程 RabbitMQ中文文档 一、…