Python 3.x 异常处理

news2024/10/6 6:49:53

文章目录

  • 异常处理
    • 1. 什么是异常
    • 2. Python 中的异常
      • python 中异常演示
      • 错误类型捕获
        • try-except 语句
        • 带有多个 expect 的 try 语句
        • 捕获未知错误
      • 异常参数
      • else 子句
      • finally子句
      • 练习 3:简化除法判断
    • 3. 自定义异常
      • 抛出异常—raise
      • 应用场景
      • 抛出异常
      • 练习 4:自定义异常

异常处理

1. 什么是异常

程序在运行时,如果 Python 解释器 遇到 到一个错误,会停止程序的执行,并且提示一些错误信息,这就是 异常

异常是因为程序出现了错误,而在正常控制流以外采取的行为

  • 这个行为又分为两个阶段:
    • 首先是引起异常发生的错误
    • 然后是检测(和采取可能的措施)阶段

2. Python 中的异常

当程序运行时,因遇到未解的错误而导致中止运行,便会出现 traceback 消息,打印异常

KeyboardInterrupt     # Ctrl + C,会产生用户中断执行错误
EOFError              # Ctrl + D,会产出此错误

python 中异常演示

>>> a + 5							# NameError,变量a没有定义
>>> 'hello'[5]						# IndexError,字符串hello的最长索引下标为4
>>> a = 10			
>>> if a = 10:						# SyntaxError,python中的等于号使用'=='表示
>>> n = input('number:' )			# 要求输入number时,Ctrl + D, 产生EOFError
>>> n = input('number: ')			# Ctrl + C,产生KeyboardInterrupt,用户中断执行

错误类型捕获

  • 在程序执行时,可能会遇到 不同类型的异常,并且需要 针对不同类型的异常,做出不同的响应,这个时候,就需要捕获错误类型了
  • 语法如下:
try:
    # 尝试执行的代码
    pass
except 错误类型1:
    # 针对错误类型1,对应的代码处理
    pass
except (错误类型2, 错误类型3):
    # 针对错误类型2 和 3,对应的代码处理
    pass
except Exception as result:
    print("未知错误 %s" % result)

try-except 语句

  • 定义了进行异常监控的一段代码,并且提供了处理异常的机制
try:
    n = int(input('number: '))  # 没有输入任何值,回车,产生ValueError异常
    print(n)
except ValueError:
    print('无效的输入')  # 当异常ValueError发生时,执行print()

带有多个 expect 的 try 语句

  • 可以把多个 except 语句连接在一起,处理一个try 块中可能发生的多种异常
# 使用多个expect的try语句,处理异常
try:
    n = int(input('number: '))  # 没有输入任何值,回车,产生ValueError异常
    print(n)
except ValueError:  # 当异常ValueError发生时,执行print()
    print('无效的输入')
except KeyboardInterrupt:  # Ctrl + C,产生KeyboardInterrupt,用户中断执行
    print('\nBye-bye')
except EOFError:  # Ctrl + D, 产生EOFError, 没有内建输入
    print('\nBye-bye')
  • 检测上述模块中异常处理结果
[root@localhost xxx] # python day01.py 
number:  # 回车,ValueError异常,s输入错误类型
无效的输入
[root@localhost xxx] # python day01.py 
number: ^CBye-bye  # Ctrl + C,KeyboardInterrupt异常,用户操作中断
[root@localhost xxx]# python day01.py 
number: Bye-bye  # Ctrl + D, EOFError异常, 没有内建输入

捕获未知错误

  • 在开发时,要预判到所有可能出现的错误,还是有一定难度的
  • 如果希望程序 无论出现任何错误,都不会因为 Python 解释器 抛出异常而被终止,可以再增加一个 except

语法如下:

except Exception as result:
    print("未知错误 %s" % result)

异常参数

  • 异常也可以有参数,异常引发后它会被传递给异常处理器
  • 当异常被引发后参数是作为附加帮助信息传递给异常处理器的

查看异常提示信息

>>> n = int(input('number: '))
number:  # 回车,ValueError异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: ''

使用多个expect的try语句,实现异常参数

try:
    n = int(input('number: '))    
    print(n)
except ValueError as e:  # 当异常ValueError发生时,将异常信息赋值给变量e
    print('无效的输入', e)  # print(), 打印异常信息
except KeyboardInterrupt:    
    print('\nBye-bye')
except EOFError:            
    print('\nBye-bye')

[root@localhost day01]# python day01.py 
number:  # 回车,ValueError异常
无效的输入 invalid literal for int() with base 10: ''  # 输出异常信息

使用多个expect的try语句,捕获多个异常

try:
    n = int(input('number: '))    
    print(n)
except ValueError as e:        
    print('无效的输入', e)       
except (KeyboardInterrupt, EOFError):  # 使用except捕获多个异常  
    print('\nBye-bye')

[root@localhost day01]# python day01.py 
number: ^C  # Ctrl + C,产生KeyboardInterrupt,用户中断执行
Bye-bye
[root@localhost day01]# python day01.py 
number:  # Ctrl + D, EOFError异常, 没有内建输入
Bye-bye

else 子句

  • 在 try 范围中没有异常被检测到时,执行 else 子句
  • 在else 范围中的任何代码运行前,try 中的所有代码必须完全成功
# else子句的使用
try:  # 有可能发生异常的代码块
    n = int(input('number: '))
except ValueError as e:  # 当异常ValueError发生时,将异常信息赋值给变量e
    print('无效的输入', e)  # print(), 打印异常信息
except (KeyboardInterrupt, EOFError):   
    print('\nBye-bye')
else:  # 当不发生异常时,要执行的代码块
    print(n)

[root@localhost day01] # python day01.py 
number: 19  # 正常输入,打印else
19

finally子句

  • finally 子句是 无论异常是否发生,是否捕捉都会执行的一段代码
  • 如果打开文件后,因为发生异常导致文件没有关闭,可能会发生数据损坏,使用finally 可以保证文件总是能正常的关闭
# finally子句的使用
try:                            # 有可能发生异常的代码块
    n = int(input('number: '))
except ValueError as e:         # 当异常ValueError发生时,将异常信息赋值给变量e
    print('无效的输入', e)        # print(), 打印异常信息
except (KeyboardInterrupt, EOFError):   
    print('\nBye-bye')
    exit()                      # 退出程序
else:                           # 当不发生异常时,要执行的代码块
    print(n)
finally:                        # 不管异常是否发生都会执行代码块
	print('Done')

[root@localhost day01]# python day01.py 
number:            # Ctrl + D, EOFError异常, 没有内建输入
Bye-bye
Done               # 出现异常,finally 继续执行

[root@localhost day01]# python day01.py 
number: 19         # 正常输入整数,打印结果
19
Done               # 没有出现异常,finally 还是继续执行

练习 3:简化除法判断

需求

  1. 提示用户输入一个数字作为除法
  2. 如果用户按下 Ctrl + C 或 Ctrl + D 则退出程序
  3. 如果用户输入非数字字符,提示用户应该输入数字
  4. 如果用户输入 0,提示用户 0 不能作为除法
# mydiv.py
try:  # 有可能发生异常的代码块
    n = int(input('number: '))
    result = 100 / n
# 当异常ValueError发生时,将异常信息赋值给变量e    
except (ValueError, ZeroDivisionError) as e:  
    print('无效的输入', e)  # print(), 打印异常信息       
except (KeyboardInterrupt, EOFError):  # 出现异常,执行print(),exit()
    print('\nBye-bye')
    exit()  # 退出程序
    
else:  # 当不发生异常时,要执行的代码块
    print(result)
    
finally:  # 不管异常是否发生都会执行代码块
    print('Done')

[root@localhost day01] # python3 mydiv.py 
number:  # 空值,回车,异常处理
无效的输入 invalid literal for int() with base 10: ''
Done  # 不管异常是否发生,都会打印

# 使用python解释器,执行day01.py
[root@localhost day01]# python3 mydiv.py 
number: 0  # 输入0,异常处理
无效的输入 division by zero
Done  # 不管异常是否发生,都会打印

3. 自定义异常

抛出异常—raise

应用场景

  • 在开发中,除了 代码执行出错 Python 解释器会 抛出 异常之外
  • 还可以根据 应用程序 特有的业务需求 主动抛出异常

示例

  • 提示用户 输入密码,如果 长度少于 8,抛出 异常

在这里插入图片描述

注意

  • 当前函数 只负责 提示用户输入密码,如果 密码长度不正确,需要其他的函数进行额外处理
  • 因此可以 抛出异常,由其他需要处理的函数 捕获异常

抛出异常

  • Python 中提供了一个 Exception 异常类
  • 在开发时,如果满足 特定业务需求时,希望 抛出异常,可以:
    1. 创建 一个 Exception对象
    2. 使用 raise 关键字 抛出 异常对象

需求

  • 定义 input_password 函数,提示用户输入密码
  • 如果用户输入长度 < 8,抛出异常
  • 如果用户输入长度 >= 8,返回输入的密码
def input_password():

    # 1. 提示用户输入密码
    pwd = input("请输入密码:")

    # 2. 判断密码长度,如果长度 >= 8,返回用户输入的密码
    if len(pwd) >= 8:
        return pwd

    # 3. 密码长度不够,需要抛出异常
    # 1> 创建异常对象 - 使用异常的错误信息字符串作为参数
    ex = Exception("密码长度不够")

    # 2> 抛出异常对象
    raise ex
try:
    user_pwd = input_password()
    print(user_pwd)
except Exception as result:
    print("发现错误:%s" % result)

练习 4:自定义异常

需求

  • 编写第一个函数,接收姓名和年龄,如果年龄不在1到120之间,产生 ValueError 异常
# 编写函数get_info(),在文件user_info.py上操作
def get_info(name, age):  # 定义函数,接收姓名和年龄
    # 异常触发ValueError,提示信息为:无效的年龄(1 ~ 119)
    if not 0 < age < 120:            
        raise ValueError('无效的年龄(1 ~ 119)')
    # 当age在0 ~ 120的范围,else代码块执行    
    else:         
        print('%s is %s years old' %(name, age))

try:  # 有可能发生异常的代码块
    get_info('tom', 200)
except ValueError as e:  # 当异常ValueError发生时,将异常信息赋值给变量e
    print('Error:', e)  # print(), 打印异常信息
    exit()  # 退出程序,不继续执行后续代码
print('Done')  # exit(),退出后,此代码不执行

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

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

相关文章

innovus:route within pin 和限制pin shape内via 数量

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 setNanoRouteMode -routeWithViaInPin "1:1" setNanoRouteMode -routeWithViaOnlyForStandardCellPin "1:1"

git 后悔药

前言 自上而下&#xff0c;撤销可以分为从远程库撤销&#xff0c;从本地库撤销&#xff0c;从暂存库撤销。 例子&#xff1a;代码已经提交了三个记录到远程库&#xff0c;分别对应了记录1&#xff0c;内容1&#xff0c;记录2&#xff0c;内容2&#xff0c;记录3&#xff0c;内…

LeetCode73.矩阵置零

这道题我感觉还是挺简单的&#xff0c;一下子就想到了&#xff0c;不过我的算法很简单很垃圾&#xff0c;效率很低&#xff0c;我一看完题的想法就是直接遍历一遍数组&#xff0c;然后把为0的元素的行和列都存起来&#xff0c;然后把这些行和列都置零就好了&#xff0c;但是这里…

IP地址、子网掩码、网络地址、广播地址、IP网段

文章目录 IP地址IP地址分类子网掩码网络地址广播地址IP网段 本文主要讨论iPv4地址。 IP地址 实际的 IP 地址是一串32 比特的数字&#xff0c;按照 8 比特&#xff08;1 字节&#xff09;为一组分成 4 组&#xff0c;分别用十进制表示然后再用圆点隔开&#xff0c;这就是我们平…

chkdsk H:/F

chkdsk H:/F TF卡损坏

nios里面打开eclipse遇到Unresolved inclusion: “system.h“等问题

问题&#xff1a;在Nios中打开软核部分代码时&#xff0c;遇到一堆Unresolved inclusion: "system.h"等问题报错 原因&#xff1a;bsp文件和软核没关联&#xff0c;导致找不到头文件地址&#xff0c;关联一下就好 解决步骤&#xff1a; 右键bsp文件&#xff0c;点击…

虚幻引擎集成web前端<一>:win环境UE4.27导出像素流并集成到vue2环境(附案例)

本案例附件&#xff1a;https://download.csdn.net/download/rexfow/88303544 第一部分&#xff1a;虚幻引擎导出像素流windows包 第1步&#xff1a;软件设置 -AudioMixer -PixelStreamingIPlocalhost -PixelStreamingPort8888 第2步&#xff1a;信令服务器设置 1、执行run_l…

2023移动软件开发实验6

2023年夏季《移动软件开发》实验报告 姓名和学号&#xff1f;本实验属于哪门课程&#xff1f;中国海洋大学23夏《移动软件开发》实验名称&#xff1f;实验6&#xff1a;推箱子博客地址&#xff1f;XXXXXXXGithub仓库地址&#xff1f;https://github.com/enfantsRichesDeprimes…

十三、MySQL(DQL)语句执行顺序

1、DQL语句执行顺序: &#xff08;1&#xff09;from来决定表 # where来指定查询的条件 &#xff08;2&#xff09;group by指定分组 # having指定分组之后的条件 &#xff08;3&#xff09;select查询要返回哪些字段 &#xff08;4&#xff09;order by根据字段内容&#…

7.0: Dubbo服务调用源码解析

课程内容 服务提供者处理请求流程解析服务消费发送请求流程解析服务提供者端线程模型解析服务消费者端线程模型解析1.服务提供者处理请求流程解析 processon链接:服务调用流程图| ProcessOn免费在线作图,在线流程图,在线思维导图 2. 服务消费端执行逻辑 MockClusterInvoker.in…

【大数据之Kafka】七、Kafka Broker之Kafka副本

1 副本基本信息 Kafka 副本可以提高数据可靠性。分为Leader 和 Follower&#xff1b;Kafka 生产者只会把数据发往 Leader&#xff0c;然后 Follower 找Leader 进行同步数据。   Kafka 默认副本 1 个&#xff0c;生产环境一般配置为 2 个&#xff0c;保证数据可靠性&#xff1…

SAP-PP:基础概念笔记-4(物料主数据视图)

文章目录 前言一、基本视图二、分类视图三、销售视图四、采购五、生产计划和执行视图六、总工厂数据/存储七、质量管理八、会计九、成本系统创建示例&#xff1a;创建一个齿轮物料的主数据事务代码:MM01&#xff0c;另一种方式spro->xxxx 总结 前言 物料主数据为许多组织创…

linux并发服务器 —— 项目实战(九)

阻塞/非阻塞、同步/异步 数据就绪 - 根据系统IO操作的就绪状态 阻塞 - 调用IO方法的线程进入阻塞状态&#xff08;挂起&#xff09; 非阻塞 - 不会改变线程的状态&#xff0c;通过返回值判断 数据读写 - 根据应用程序和内核的交互方式 同步 - 数据的读写需要应用层去读写 …

DX底图还原

直接定位到这个地方 我们可以看到他有一个Bn函数&#xff0c;其中传入的参数有n,e,r,t 分别是这些东西 但是我们只需要还原的列表就得看是哪一段是咯 An((i (i r.split("/"))[i.length - 1]).split(".")[0]) 发现是他之后我们就直接把这个函数扣下来&…

【vue2第十三章】自定义指令 自定义v-loading指令

自定义指令 像 v-html&#xff0c;v-if&#xff0c;v-for都是vue内置指令&#xff0c;而我们也可以封装自定义指令&#xff0c;提升编码效率。 什么是自定义指令&#xff1f; 自己定义的一些指令&#xff0c;可以进行一些dom操作&#xff0c;扩展格外的功能。比如让图片懒加载…

第七章:敏捷开发工具方法-part2-CI/CD工具介绍

文章目录 前言一、CI-持续集成1.1 安装部署gitlab 二、gitlab CI配置三、jenkins实现CI / CD3.1 安装jenkins3.2 配置CI3.3 配置CD3.4 其他构建方式1、定时构建2、指定参数构建3、webhook自动根据git事件进行构建 前言 什么是CI/Cd&#xff1f; CI-Continuous integration&…

web前端——简单的网页布局案列

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 目录 问题背景 解决样例 …

[Vue3 博物馆管理系统] 使用Vue3、Element-plus tabs组件构建选项卡功能

系列文章目录 第一章 定制上中下&#xff08;顶部菜单、底部区域、中间主区域显示&#xff09;三层结构首页 第二章 使用Vue3、Element-plus菜单组件构建菜单 第三章 使用Vue3、Element-plus走马灯组件构建轮播图 第四章 使用Vue3、Element-plus tabs组件构建选项卡功能 [第五…

Tomcat多实例和负载均衡动静分离

一、Tomcat多实例部署 安装jdk 设置jdk环境变量 安装tomcat 配置Tomcat环境变量 修改端口号 修改tomcat中startup.sh和shutdown.sh文件添加tomcat环境变量 启动Tomcat中的startup.sh 浏览器测试 http://192.168.30.100:8080 http://192.168.30.100:8081 二、负载均衡动静分离…

GPT 内部 — I : 了解文本生成

年轻的陀思妥耶夫斯基被介绍给生成AI&#xff0c;通过Midjourney创建 一、说明 我经常与不同领域的同事互动&#xff0c;我喜欢向几乎没有数据科学背景的人传达机器学习概念的挑战。在这里&#xff0c;我试图用简单的术语解释 GPT 是如何连接的&#xff0c;只是这次是书面形式。…