[Python 公开课] 零基础玩转 Python 进阶篇 ---- 第二节:Python 的异常分析及解决
📢📢📢📣📣📣🌻🌻🌻Hello,大家好我叫是 Dream 呀,一个有趣的 Python 博主,多多关照😜😜😜🏅🏅🏅CSDN Python 领域优质创作者,大二在读,欢迎大家找我合作学习(文末有 VX 想进学习交流群 or 学习资料 欢迎+++)💕
入门须知:这片乐园从不缺乏天才,努力才是你的最终入场券!🚀🚀🚀
💓最后,愿我们都能在看不到的地方闪闪发光,一起加油进步🍺🍺🍺
🍉🍉🍉“一万次悲伤,依然会有 Dream,我一直在最温暖的地方等你”,唱的就是我!哈哈哈~🌈🌈🌈🌟🌟🌟✨✨✨
前言:
📢📢📢【Python公开课】系列课程是针对 Python 入门 &进阶打造的一全套课程,如果你喜欢的话就抓紧收藏订阅起来吧~💘💘💘【报团取暖】🆘🆘🆘🍋🍋🍋如果对学习没有自制力或者没有一起学习交流的动力,欢迎私信或者在文末添加我的 VX,我会拉你进学习交流群,我们一起交流学习,报团打卡
@TOC
1️⃣ 学习目标----提前知💞💞💞
☀️☀️☀️一个崇高的目标,只要不渝地追求,就会成为壮举!
理解异常的概念
掌握处理异常的几种方式
掌握 raise 和 assert 语句,会抛出自定义的异常
掌握 with 和 as 环境安装器的使用
2️⃣ 学习任务----我能行🍻🍻🍻
🏅🏅🏅穷且益坚,不坠青云之志!
🚩01 异常简介
异常介绍
在 Python 中,程序在执行的过程中产生的错误称为异常
,比如列表索引越界、打开不存在的文件等。这两行代码会报错吗?
报错信息:
第 1 个异常的类型为 NameError(名称),描述信息为 a 没有定义;
第 2 个异常为 FileNotFoundError,描述信息为没有找到 123.txt 文件
🚩02 异常类
所有异常都是基类Exception
的成员,它们都定义在exceptions模块
中。如果这个异常对象没有进行处理和捕捉,程序就会用所谓的回溯(traceback,一种错误信息)终止执行,这些信息包括错误的名称(例如 NameError)、原因和错误发生的行号。
1. NameError
尝试访问一个未声明的变量,会引发 NameError。
2. ZeroDivisionError
当除数为零的时候,会引发 ZeroDivisionError 异常。
3. SyntaxError
当解释器发现语法错误时,会引发 SyntaxError 异常
4. IndexError
当使用序列中不存在的索引时,会引发 IndexError 异常
5. KeyError
当使用映射中不存在的键时,会引发 KeyError 异常。
6. FileNotFoundError
试图打开不存在的文件时,会引发 FileNotFoundError
7. AttributeError
当尝试访问未知对象属性时,会引发 AttributeError 异常
🚩03 异常处理
捕获简单异常
try-except语句
定义了监控异常的一段代码,并提供了处理异常的机制。
捕获多个异常
处理多个异常的 try-except 语句格式如下:
捕获异常的描述信息
当出现多种异常时,为了区分不同的错误信息,可以使用as
获取系统反馈的信息。
捕获所有的异常
当程序中出现大量异常时,捕获这些异常是非常麻烦的。这时,我们可以在except子句中不指明异常的类型
,这样,不管发生何种类型的异常,都会执行 except 里面的处理代码。
没有捕获到异常(else)
如果 try 语句没有捕获到任何的错误信息,就不再执行任何 except 语句,而是会执行else语句
。
终止行为(finally)
在程序中,无论是否捕捉到异常,都必须要执行某件事情,例如关闭文件、释放锁等,这时可以提供finally语句
处理。通常情况下,finally 用于释放资源。
🚩 04 抛出异常
1.raise 语句
使用 raise 语句能显示地触发异常,格式如下:
raise 异常类名(引发指定异常类的实例)
raise 异常类对象(引发指定异常类的实例)
raise (重新引发刚刚发生的异常)
1. 使用类名引发异常
当 raise 语句指定异常的类名时,会创建该类的实例对象,然后引发异常。raise IndexError:
2. 使用异常类的实例引发异常
index = IndexError() raise index
3. 传递异常
不带任何参数的 raise 语句,可以再次引发刚刚发生过的异常,作用就是向外传递异常。
4. 指定异常的描述信息
raise IndexError("索引下标超出范围")
5. 异常引发异常
使用 raise...from…可以在异常中抛出另外的异常。
try里面只定义了变量num
,会引发 NameError 异常。except子句使用raise...from…
抛出 NameError 异常后再抛出“下标越界”的异常。
2.assert 语句
assert语句
又称作断言
,指的是期望用户满足指定的条件。当用户定义的约束条件不满足的时候,它会触发 AssertionError 异常,所以assert语句可以当做条件式的raise语句
。assert 语句格式如下:assert 逻辑表达式,data →if not 逻辑表达式: raise AssertionError(data)
assert 后面紧跟一个逻辑表达式,相当于条件。Data 通常是一个字符串,当条件为 false 时作为异常的描述信息。
🚩05 自定义异常
创建一个继承 Exception类的子类
,就是自定义异常类。当遇到自己设定的错误时,使用raise语句抛出自定义的异常
。
🚩06 with 和 as 环境安装器
with 语句
现在有一个需求,打开 foo.txt 文本文件,读取完所有的数据以后关闭文件。 示例代码如下:
文件读取出现问题怎么办?忘记关闭文件出现问题怎么办?
为了避免在文件读取的过程中产生这些问题,可以在上述示例中增加处理异常的语句, 加强版本如下:
该代码虽然解决了产生异常的可能,但是这段代码过于冗长。此时,在示例中使用 with 语句处理上下文环境产生的异常,具体如下:
Python 2.5 开始,引入了 with 语句,with语句适用于对资源进行访问的场合
,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源。with 语句格式:
with 语句执行过程:(1)执行 context_expr,生成上下文管理 context_manager;(2)调用上下文管理器的__enter__()方法,如果使用了 as 子句,就把__enter__() 方法的返回值赋值给 as 子句中的 var;(3)执行语句体 with_body。(4)无论在执行的过程中是否发生异常,都会执行上下文管理器的 exit() 方法。该方法负责执行程序的“清理”工作,如释放资源等。(5)如果执行过程中没有出现异常,或者语句体中执行了 break、continue 或者 return 语句,则以 None 作为参数调用__exit__()方法;如果执行过程中出现异常,则会使用 sys.exc_info 得到的异常信息为参数调用__exit__()方法。(6)出现异常时,如果__exit__()方法返回的结果为 False,则会重新抛出异常,让 with 之外的语句逻辑来处理异常,这是通用做法;如果返回 True,则忽略异常,不再对异常进行处理。
上下文管理器
要想使用 with 语句进行工作,前提是要有上下文管理器。上下文管理器是 Python 2.5 开始支持的一种语法,用于规定某个对象的使用范围,一旦进入或者离开使用范围,会有特殊的操作被调用。
1. 上下文管理协议
__enter__(self):
进入上下文管理器时调用此方法,其返回值被放入 with-as 语句中 as 说明符指定的变量中。_exit__(self, type, value, tb):
离开上下文管理器调用此方法。如果有异常出现,type、value、tb 分别为异常的类型、值和追踪信息;如果没有异常,3 个参数均设为 None。此方法返回值为 True 或者 False,分别指示被引发的异常得到了还是没有得到处理,如果返回 False,引发的异常会被传递出上下文。
2. 上下文管理器
支持上下文管理协议的对象,用于实现__enter__()和__exit__()方法。上下文管理器定义执行 with 语句时要建立的运行时上下文,负责执行 with 语句块上下文中的进入与退出操作。通常情况下,使用 with 语句调用上下文管理器,也可以通过直接调用其方法来使用。
3. 运行时上下文
由上下文管理器创建,通过上下文管理器的__enter__()和__exit__()方法实现。其中,enter() 方法在语句体执行之前进入运行时上下文,exit() 在语句体执行完后从运行时上下文退出。
3️⃣ 本章小结----知难易🏆🏆🏆
😊😊😊人生是跋涉,也是旅行;是等待,也是重逢;是探险,也是寻宝;是眼泪,也是歌声!
本章围绕着 Python 的异常进行介绍,包括异常类、抛出和捕捉系统内置的异常、抛出和捕捉自定义异常,以及with和as环境安装器
。通过对本章的学习,大家应该深入了解了异常产生的原理,并知道如何在程序中运行它们。
4️⃣ 小试牛刀----习题讲解🌈🌈🌈
🏃 🏃 🏃本期问题
✍第一题
13. 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153 是一个"水仙花数",因为 153=1 的三次方+5 的三次方+3 的三次方。代码:
思路:利用 for 循环控制 100-999 个数,每个数分解出个位,十位,百位
。这个没啥好说的,记住整除取余的一系列操作就行了!
✍第二题
14.将一个正整数分解质因数。例如:输入 90,打印出 90=233*5。代码:
思路:看到这道题我看到的时候第一想法:结合素数求法进行求解,双循环结构
,但后来仔细一想,能被目标数从 0 开始遍历,前面的数如果能被整除的话不会轮到后面,所以说根本就不用判断是不是素数,直接从 2 开始,看看谁可以被目标数整除,该数肯定是素数。 然后通过格式化字符串进行输出!简化一下代码:
🏆往期文章----好文推荐🏆
🥇 我与CSDN的2021 --从路人到一名万粉博主的自述🥈 【Python训练营】快来一场一场刷题狂欢的party吧!🥉 [Python公开课]零基础玩转Python进阶篇----第一节:Python中的文件操作💕💕💕 好啦,这就是今天要分享给大家的全部内容了,我们下期再见!✨ ✨ ✨🍻🍻🍻如果你喜欢的话,就不要吝惜你的一键三连了~
评论