初始Python篇(8)—— 异常

初始Python篇(8)—— 异常

找往期文章包括但不限于本期文章中不懂的知识点:

个人主页:我要学编程(ಥ_ಥ)-ZEEKLOG博客

所属专栏: Python

目录

异常介绍

异常的处理

try-except 

try-except-else 

try-except-else-finally

异常的抛出 

常见的异常类型


 

异常介绍

在学习异常之前,先了解bug的概念。简单理解就是程序运行不起来或者运行起来之后,输出的结果不符合我们的预期。有了bug肯定是要去解决的。而解决bug就离不开异常的处理。

如果是程序运行出错,有两种情况:1、程序本身就存在问题;2、对于存在输入型程序来说,可能是用户的输入导致程序报错。

第一种情况,就需要我们自己去排查,看是哪里出现了语法错误。

第二种情况,就需要用到我们今天学习的异常处理。

如果是程序运行之后,结果不符合我们的预期,这就需要用到调试工具了。

异常的处理

try-except 

Python中对于异常的处理是通过 try-except 语句来捕获异常的。

语法:

try: ... // 可能出现异常的代码 except 异常类型A: ... // 处理异常的代码(程序报错之后执行的代码) except 异常类型B: ... // 处理异常的代码(程序报错之后执行的代码)

代码演示: 

try: num1 = int(input('请输入一个数:')) num2 = int(input('请输入一个数:')) print('{0} / {1}的结果是:{2}'.format(num1, num2, num1//num2)) # // 这是整数除法 except ZeroDivisionError: print('除数为0异常')

上面只是一种情况,还会出现其他的异常输入。

从上面的结果,我们可以看出:程序抛出异常之后,就不会继续执行下去了,要么去执行捕获异常之后的代码,要么直接就摆烂了。 

处理异常:

except ValueError: print('请输入一个合法的整数')

因此,当我们以后遇到异常之后,即使不知道是啥异常,但只要我们将异常给捕获了,程序就不会直接结束,而是会执行 except 语句代码。 

try-except-else 

除此之外,Python还提供了类似 while-else的语句。当程序将try中的代码全部执行完毕之后(意味着不存在异常),就会去执行 else 语句。

语法:

try: ... // 可能出现异常的代码 except 异常类型A: ... // 处理异常的代码(程序报错之后执行的代码) except 异常类型B: ... // 处理异常的代码(程序报错之后执行的代码) ....... // 剩余异常 else: ... // 程序没有异常将会执行的代码

代码演示:

try: num1 = int(input('请输入一个数:')) num2 = int(input('请输入一个数:')) print('{0} / {1}的结果是:{2}'.format(num1, num2, num1//num2)) # // 这是整数除法 except ZeroDivisionError: print('除数为0异常') except ValueError: print('请输入一个合法的整数') else: print('程序执行完毕')

运行结果:

else 语句中的代码主要是 用来区分 程序无异常时,将会执行的代码。因此我们可以将计算的结果放到else语句中去输出。

代码演示:

try: num1 = int(input('请输入一个数:')) num2 = int(input('请输入一个数:')) result = num1 // num2 except ZeroDivisionError: print('除数为0异常') except ValueError: print('请输入一个合法的整数') else: print('{0} / {1}的结果是:{2}'.format(num1, num2, result)) print('程序执行完毕')

这可以增加代码整体布局的美观性。

try-except-else-finally

当程序抛出异常之后,try语句中剩余的代码并不会执行了,那如果剩余的代码中,有一些逻辑是为了安全性考虑的呢,这如果不执行的话,那就会导致程序存在安全问题。如果要执行的话,该怎么办呢?将一些重要逻辑代码全部放到except中,每一个语句都放一份,这样的确可行,但是太过冗余了。因此,便有了 finally 语句:无论程序是否抛出异常,其中的代码都会执行。

语法:

try: ... // 可能出现异常的代码 except 异常类型A: ... // 处理异常的代码(程序报错之后执行的代码) except 异常类型B: ... // 处理异常的代码(程序报错之后执行的代码) ....... // 剩余异常 else: ... // 程序没有异常将会执行的代码 finally: ... // 无论程序是否抛出异常都会被执行

代码演示:

try: num1 = int(input('请输入一个数:')) num2 = int(input('请输入一个数:')) result = num1 // num2 except ZeroDivisionError: print('除数为0异常') except ValueError: print('请输入一个合法的整数') else: print('{0} / {1}的结果是:{2}'.format(num1, num2, result)) print('程序执行完毕') finally: print('I love coding')

运行结果:

修改后的结果: 

异常的抛出 

一个程序需要用户某些值时,但是用户输入的值又不符合我们的要求,针对这种情况就可以去让程序手动抛出异常。 这个异常是通过 raise 关键字来抛出的。

语法:

raise [Exception类型(异常描述信息)]

 代码演示:

try: num = int(input('请输入一个1-100之间的整数:')) if num >= 1 and num <= 100: print(f'你输入的数字是:{num}') else: raise Exception('不符合程序要求') except ValueError: print('请输入一个整数') # e这里是作为异常对象,如果我们去打印Exception时打不出其中的异常信息 # 需要用到 as 别名 的语法,然后去打印e这个对象,就可以将异常信息大于出来 except Exception as e: print(e)

运行结果:

因为 ValueError 这是Python内置的异常类,当其中的异常信息已经被填充了,所以这就无需我们手动填充,并且也不需要我们去起别名。

注意:

1、在使用 raise 关键字抛异常时,这个异常可以是内置的异常,也可以是我们自己构造出来的异常。但我们在使用自己构造的异常时,最好还是去描述异常的详细信息,以便于后续排查。

2、在except 语句中,去捕获异常时,是从上到下依次判断的,也就是先是判断异常是否为 ValueError,再去判断是否为 Exception。由于 ValueError 是 Exception 的子类,如果当 Exception 写在前面先判断时,就会出现无论是什么样的异常都会被Exception给捕获,从而导致异常被错误的处理了。这里的"子类"、"父类"等概念先不用管,后面学习类和对象就明白了。

3、我们如果先想要打印出描述异常的详细信息,就需要给异常起一个别名,然后通过别名去打印出来。

常见的异常类型

异常类型描述类型
ZeroDivisionError当除数为0时,所引发的异常
IndexError索引超出范围所引发的异常
KeyError字典取值时,key不存在所引发的异常
NameError使用未声明的变量时,所引发的异常
SyntaxError语法错误(一般,编译器能识别出来)
ValueError传入的值错误
AttributeError访问对象的属性或者方法不存在所引发的异常
TypeError类型不合适所引发的异常
IndentationError不正确的缩进所引发的异常

下面我们对上述涉及的异常来演示一下:

# ZeroDivisionError # print(10 / 0) # IndexError # lst = [1,2] # print(lst[3]) # KeyError # 只有以下两种方式触发:KeyError # d = {'张三':18, '李四':20} # d.pop('小军') # print(d['小明']) # NameError # print(name, age) # SyntaxError # 学过C语言的同学,刚接触可能会犯这样的错误 # for (int i = 0; i < 10; i++) { # printf("%d", i); # } # ValueError # age = int('18.5') # TypeError # print('12'+12) # IndentationError # if 1 == 1: # print(1)

由于我们还没有学习 类和对象,因此这里的 AttributeError 不是很好演示。等后面我们学习了类和对象之后,再去尝试就行了。

好啦!本期 初始Python篇(8)—— 异常 的学习之旅 就到此结束啦!我们下一期再一起学习吧!

Read more

基于YOLOv8/YOLOv10/YOLOv11/YOLOv12与SpringBoot的跌倒检测系统(千问+DeepSeek智能分析+web交互界面+前后端分离+YOLO数据)

基于YOLOv8/YOLOv10/YOLOv11/YOLOv12与SpringBoot的跌倒检测系统(千问+DeepSeek智能分析+web交互界面+前后端分离+YOLO数据)

项目摘要 本项目旨在设计并实现一个高效、智能且用户友好的基于多版本YOLO深度学习模型与SpringBoot Web框架的实时跌倒检测系统。随着全球老龄化社会的加速到来,老年人在日常生活中发生跌倒的风险日益增高,及时、准确地检测跌倒事件对于保障其生命安全与健康具有重大社会意义。传统监控或穿戴式设备存在隐私侵扰、用户体验不佳或漏报率高等局限。因此,本项目融合了当前前沿的计算机视觉技术与现代Web开发架构,构建了一个集智能分析、实时监控、数据管理与远程交互于一体的综合性解决方案。 系统的核心检测引擎采用了性能卓越的YOLO系列目标检测算法,并创新性地集成了YOLOv8、YOLOv10、YOLOv11及YOLOv12四种最新版本模型,为用户提供了灵活、可对比的算法选择,以适应不同的精度与速度需求。模型在精心标注的自定义数据集上进行训练与验证,该数据集包含 ‘fallen’(已跌倒)、‘falling’(正在跌倒)和‘stand’(站立/正常) 三个关键类别,共计3,888张图像(训练集3,594张,验证集294张),确保了系统对跌倒过程动态的精确识别能力。 系统后端采用SpringB

By Ne0inhk

node.js下载、安装、设置国内镜像源(永久)(Windows11)

目录 * node-v20.18.0-x64 * 工具 * 下载 * 安装 * 设置国内镜像源(永久) node-v20.18.0-x64 工具 系统:Windows 11 下载 1. 官网https://nodejs.org/zh-cn/download/package-manager 版本我是跟着老师选的node-v20.18.0-x64 下载完成 如图选择 Windows、x64、v20.18.0 (LTS),点击下载 安装 next、next、Install、Finish 自定义安装地址,我安到了F:Program Files odejs I accept打勾,next next

By Ne0inhk

Spring IOC 和 AOP 完全详解:从入门到精通

Spring IOC 和 AOP 完全详解:从入门到精通 📝 博客简介:本文将深入浅出地讲解Spring框架的两大核心特性——IOC(控制反转)和AOP(面向切面编程)。适合Spring初学者和准备面试的同学阅读。 🎯 知识目标:理解IOC和AOP的概念、实现机制、应用场景,并掌握依赖注入和反射的原理。 📋 目录 * 一、Spring IOC(控制反转)详解 * 二、Spring AOP(面向切面编程)详解 * 三、反射机制详解 * 四、实战代码演示 * 五、常见面试问题汇总 一、Spring IOC(控制反转)详解 1.1 什么是IOC? 📖 概念解释 IOC(Inversion of Control,控制反转) 是一种设计原则,

By Ne0inhk
黑马点评完整代码(RabbitMQ优化)+简历编写+面试重点 ⭐

黑马点评完整代码(RabbitMQ优化)+简历编写+面试重点 ⭐

简历上展示黑马点评 完整代码地址 微服务学成在线项目 前言 当初就是当作一个学习笔记和个人面试记录发的,没想到这么多人收藏浏览,还是感慨学Java的人确实多啊。 适合什么人看呢,我仅仅说说我个人的理解,因为我现在也是个经历秋招的双非学生。 1.初学者学习完Redis基础,想来个实战,黑马点评还是特别好的一个项目,基本包含了所有数据类型的运用和redis其他功能的扩展,这篇文章可以带你提炼重点,很好的走下流程。 2.但大部分人是冲着找实习和秋招去的,像我这种学历不高的秋招就不要写黑马点评了,即使包装,也会很容易看出来,我找实习的时候就被面试官问到这是不是黑马点评过,我们可以把其中的闪光点迁移到你找的其他项目中,比如缓存穿透雪崩击穿的解决方法,redisson分布式锁解决一人一单,这种在大多项目中都可以添加,自圆其说就行。 3.对于找实习的像大二,大三上的,想找个小厂试试手垂直向上升的,可以吃透它,面试官问你遇到的困难或者是你觉得难点,就可以重点讲一人一单这个解决方法和流程,越详细越好。 4.前提是大家不用直接用这套模板,太多人用了,这也是我从网上找的别人的,巧用AI让它改改项

By Ne0inhk