Python快速编程入门(第3版) 课件 第9章 异常_第1页
Python快速编程入门(第3版) 课件 第9章 异常_第2页
Python快速编程入门(第3版) 课件 第9章 异常_第3页
Python快速编程入门(第3版) 课件 第9章 异常_第4页
Python快速编程入门(第3版) 课件 第9章 异常_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章异常《Python快速编程入门(第3版))》学习目标/Target了解异常,能够说出异常的概念以及异常信息的组成部分掌握try-except语句的使用,能够在程序中通过try-except语句捕获与处理异常掌握try-except-else语句的使用,能够在else子句中添加没有异常的处理代码熟悉异常类,能够说出常见的异常类型及其含义掌握try-except-finally语句的使用,能够在finally子句中添加释放资源的代码学习目标/Target掌握raise语句的使用,能够在程序中通过raise语句抛出异常了解异常的传递,能够说出异常传递的特点掌握自定义异常的方式,能够在程序中自定义并处理异常掌握assert断言语句的使用,能够在程序中通过assert语句抛出异常章节概述/Summary在现实生活中,我们经常会遇到各种突发情况,比如航班延误、火车晚点等,而在程序中同样不可避免地会出现异常,比如试图打开一个不存在的文件、访问未定义的变量等。开发人员需要辨别程序的异常,明确这些异常是源于程序本身的设计问题,还是由外界环境的变化引起,以便有针对性地处理异常。为了帮助开发人员处理异常,Python提供了功能强大的异常处理机制。本章将针对异常的相关内容进行详细地讲解。目录/Contents010203异常概述异常捕获语句抛出异常04自定义异常05实训案例异常概述9.1

先定一个小目标!了解异常,能够说出异常的概念以及异常信息的组成部分9.1.1认识异常9.1.1认识异常异常是在程序运行期间发生的错误,意外或不正常情况,可能是由于外部环境、不正确的输入、无效的操作或其他因素引起的。如果一个程序在运行的过程中出现异常,并且没有对异常进行处理,那么此时解释器会采用默认方式处理异常,即终止程序并给出相应的异常信息。9.1.1认识异常异常信息中通常包含异常代码所在行号、异常的类型和异常的描述信息。下面以四则运算的程序为例介绍异常信息,现有一个四则运算的程序,该程序中在进行除法操作时并没有处理除数为0的情况,具体代码如下:defcalculate(operation,num1,num2):ifoperation=="+":returnnum1+num2elifoperation=="-":returnnum1-num2elifoperation=="*":returnnum1*num2elifoperation=="/":returnnum1/num2else:return"无效的运算符"expression=input("请输入运算式(例如2+3):")expression_list=expression.split()num1=int(expression_list[0])operation=expression_list[1]num2=int(expression_list[2])result=calculate(operation,num1,num2)print("运算结果:",result)9.1.1认识异常异常信息提供了有关发生错误位置、错误类型和错误原因的详细描述,通过阅读异常信息,可以了解导致程序出现异常的具体原因,进而采取适当措施解决或处理异常情况,使程序变得更加健壮和可靠。

先定一个小目标!熟悉异常类,能够说出常见的异常类型及其含义9.1.2异常类9.1.2异常类Python程序运行出错时产生的每个异常类型都对应一个类,程序运行时出现的异常大多继承自Exception类,Exception类又继承了BaseException基类。BaseException类是所有异常类型的基类,它派生了四个子类,分别是Exception、KeyboardInterrupt、GeneratorExit和SystemExit,其中Exception是所有内置的、非系统退出的异常的基类;KeyboardInterrupt是用户中断执行时会产生的异常;GeneratorExit表示生成器退出异常;SystemExit表示Python解释器退出异常。1.NameErrorNameError是程序中使用了未定义的变量时会引发的异常。NameError异常通常发生在以下几种情况:(1)在使用变量之前,没有对变量进行赋值。(2)使用一个未导入的模块或未定义的函数名或类名。(3)在函数内部访问全局变量,但全局变量还没有被赋值。例如,访问一个未定义过的变量test,具体代码如下:9.1.2异常类print(test)示例2.IndexErrorIndexError是程序中使用了超出序列范围的索引时引发的异常。当使用索引访问列表、元组、字符串这几种序列类型的元素时,如果指定的索引超出了序列的范围,就会导致程序引发IndexError异常。例如,定义一个空列表num_list,访问该列表中索引为0的元素,具体代码如下:9.1.2异常类num_list=[]print(num_list[0])示例3.AttributeErrorAttributeError是使用对象访问不存在的属性或者调用不存在的方法时引发的异常。例如,Car类中动态地添加了两个属性color和brand,使用Car类的对象依次访问color、brand属性,以及不存在的name属性,具体代码如下:9.1.2异常类classCar(object):passcar=Car()car.color="红色"car.brand='兰博基尼'print(car.color)print(car.brand)print()示例4.FileNotFoundErrorFileNotFoundError是未找到指定文件或目录时引发的异常。例如,打开一个本地不存在的文件,具体代码如下:9.1.2异常类file=open("test.txt")示例异常捕获语句9.2

先定一个小目标!9.2.1使用try-except语句捕获异常掌握try-except语句的使用,能够在程序中通过try-except语句捕获与处理异常try-except语句是基本的异常捕获语句,用于捕获和处理程序可能发生的异常,以避免程序意外终止运行。try-except语句的基本语法格式如下:try:

可能出现异常的代码except[异常类[as异常信息]]:

捕获异常后的处理代码语法格式以上语法格式中,try子句之后为可能出错的代码,也就是需要被监控的代码;except子句中可以指定异常类,若指定了异常类,该子句只对与指定异常类匹配的异常进行捕获,否则将捕获try子句中产生的所有异常。except子句中的as关键字用于将捕获到的异常信息赋值给一个变量,as及其后面的异常信息可以省略。except子句后的代码是捕获异常后的处理代码。9.2.1使用try-except语句捕获异常值得一提的是,在except子句后面可以添加多个except子句,每个except子句用于捕获不同类型的异常,实现更精细化的异常处理。当程序监控到异常时,会按照顺序逐个查找与该异常类型匹配的except子句。9.2.1使用try-except语句捕获异常9.2.1使用try-except语句捕获异常try-except语句的执行过程为:优先执行try子句中的代码。若try子句中的代码没有出现异常,则会忽略except子句而继续向下执行;若try子句中的代码出现异常,则会忽略try子句的剩余代码,转而执行except子句:若try子句出现的异常类型与except子句中指定的异常类型匹配,则执行except子句中的代码,否则按默认的方式终止程序的运行。1.捕获单个异常捕获单个异常的方式比较简单,只需要在except子句之后指定捕获的单个异常类即可,示例代码如下:num_one=int(input("请输入被除数:"))num_two=int(input("请输入除数:"))try:print("结果为",num_one/num_two)exceptZeroDivisionError:print("出错了")示例9.2.1使用try-except语句捕获异常为了明确知道异常产生的原因,这里可以在异常类型之后使用关键字as来获取异常的具体信息,修改后的代码如下:9.2.1使用try-except语句捕获异常num_one=int(input("请输入被除数:"))num_two=int(input("请输入除数:"))try:print("结果为",num_one/num_two)exceptZeroDivisionErroraserror:print(“出错了,原因:",error)示例2.捕获多个异常捕获多个异常的实现方式比较多样,既可以通过多个except子句完成,也可以通过一个except子句完成。若通过一个except子句完成,则需要在关键字except之后以元组形式指定多个异常类,示例代码如下:9.2.1使用try-except语句捕获异常num_one=int(input("请输入被除数:"))num_two=int(input("请输入除数:"))try:print("结果为",num_one/num_two)exceptZeroDivisionErroraserror:print(“出错了,原因:",error)示例3.捕获全部异常如果要捕获程序中所有的异常,那么可以将except之后的异常类设置为Exception,或者省略不写任何异常类。需要注意的是,若是省略异常类,则except子句中将无法获取异常的具体信息。示例代码如下:9.2.1使用try-except语句捕获异常try:num_one=int(input("请输入被除数:"))num_two=int(input("请输入除数:"))print("结果为",num_one/num_two)exceptExceptionaserror:print("出错了,原因:",error)示例

先定一个小目标!掌握try-except-else语句的使用,能够在else子句中添加没有异常的处理代码9.2.2try-except-else语句Python中try-except语句还可以与else子句联合使用,组成结构更加复杂的try-except-else语句。当程序执行try-except-else语句时,若try子句的代码没有产生任何异常,则会执行else子句的代码。try-except-else语句的语法格式如下:9.2.2try-except-else语句try:

可能出现异常的代码except[异常类[as异常信息]]:

捕获异常后的处理代码else:

没有异常的处理代码语法格式无论程序是否成功捕获处理了异常,else子句中的代码都不会被执行。这意味着只有程序在没有异常发生时,else子句中的代码才会执行。根据这个特点,else子句通常用于处理与异常处理相关的正常流程代码,例如在处理完异常后继续执行其他操作,使异常处理逻辑和正常流程代码能够明确区分开来。9.2.2try-except-else语句两个数进行除法运算时,分别使用except子句和else子句处理除数为0和除数不为0的情况,示例代码如下:first_num=int(input("请输入被除数:"))second_num=int(input("请输入除数:"))try:res=first_num/second_numexceptZeroDivisionErroraserror:print('异常原因:',error)else:print(res)示例9.2.2try-except-else语句

先定一个小目标!掌握try-except-finally语句的使用,能够在finally子句中添加释放资源的代码9.2.3try-except-finally语句Python中try-except语句还可以与finally子句联合使用,组成结构更加复杂的try-except-finally语句。当程序执行try-except-finally语句时,无论try子句的代码有没有出现异常,都会执行finally子句的代码。try-except-finally语句的语法格式如下:try:

可能出现异常的代码except[异常类型[as异常信息]]:

捕获异常后的处理代码finally:

一定被执行的代码语法格式9.2.3try-except-finally语句无论try子句监控的代码是否出现异常,finally子句中的代码都会被执行,基于此种特性,finally子句一般用于预设资源的清理操作,比如关闭文件、关闭网络连接、关闭数据库连接等。例如,使用finally子句执行关闭文件的操作,具体代码如下:9.2.3try-except-finally语句file=open('test.txt',mode='r',encoding='utf-8')try:file.write("人生苦短,我用Python")exceptExceptionaserror:print("写入文件失败",error)finally:file.close()print('文件已关闭')抛出异常9.3

先定一个小目标!9.3.1使用raise语句抛出异常掌握raise语句的使用,能够在程序中通过raise语句抛出异常9.3.1使用raise语句抛出异常Python程序中的异常不仅可以自动触发,还可以由开发人员使用raise语句主动引发异常。raise异常类

raise异常类对象

raise 语法格式以上3种格式都是通过raise语句抛出异常。第1种格式和第2种格式是对等的,都会抛出指定类型的异常,其中第1种格式会隐式创建一个该异常类型的对象,第2种形式会直接提供一个该异常类型的对象;第3种格式用于重新抛出刚刚发生的异常。1.使用异常类抛出异常使用“raise异常类”语句可以抛出该语句中异常类对应的异常,示例代码如下:9.3.1使用raise语句抛出异常raiseIndexError“raise异常类”语句在执行时会先隐式地创建该语句中异常类的对象,然后才抛出异常。2.使用异常类对象抛出异常使用“raise异常类对象”语句可以抛出该语句中异常类对象对应的异常,示例代码如下:9.3.1使用raise语句抛出异常raiseIndexError()raise之后的“IndexError()”用于创建异常类对象,创建异常类对象时通过字符串指定异常的具体信息,示例代码如下:raiseIndexError('索引超出范围')#抛出异常及其具体信息3.重新抛出异常使用不带任何参数的“raise”语句可以抛出刚刚发生过的异常,示例代码如下:9.3.1使用raise语句抛出异常try:raiseIndexError('索引超出范围')except:raisetry子句会捕获raise语句抛出的异常,except子句会被执行;except子句后的代码又使用raise语句抛出刚刚发生的IndexError异常,最终程序因再次抛出异常而终止执行。

先定一个小目标!9.3.2使用assert语句抛出异常掌握assert断言语句的使用,能够在程序中通过assert语句抛出异常assert语句又称为断言语句,用于在程序运行过程中检查某些条件是否满足。如果条件不满足,assert语句会抛出一个AssertionError

异常中断程序的执行。assert语句的语法格式如下所示:assert表达式[,异常信息]语法格式以上语法格式的assert后面紧跟一个表达式,表达式的值为False时,assert语句会抛出AssertionError异常,值为True时不做任何操作。表达式之后的异常信息是可选的,用来说明出现异常的原因。9.3.2使用assert语句抛出异常9.3.2使用assert语句抛出异常assert语句主要用于开发和调试阶段,用于在程序中插入断言来验证开发人员的假设和预期,并及早发现潜在的问题和错误。接下来,使用assert语句判断用户输入的除数是否为0,示例代码如下:num_one=int(input("请输入被除数:"))num_two=int(input("请输入除数:"))assertnum_two!=0,'除数不能为0'#assert语句判定num_two不等于0result=num_one/num_twoprint(num_one,'/',num_two,'=',result)

先定一个小目标!9.3.3异常的传递了解异常的传递,能够说出异常传递的特点当一个异常在程序中被抛出后,它会从触发的位置开始,沿着程序的执行路径逐级向上传递。如果在当前执行层没有找到处理该异常的代码,异常就会继续向上传递。这一过程会持续进行,直到找到能够处理该异常的代码或者到达程序的顶层。如果到达程序顶层后仍然没有找到处理异常的地方,程序将会崩溃,并显示出相应的错误信息。9.3.3异常的传递通过一个计算正方形面积的案例演示异常的传递过程,该案例的代码有get_width()、calc_area()与show_area()这三个函数,其中get_width()函数用于获取用户输入的正方形边长,calc_area()函数用于根据用户输入的边长计算正方形面积,show_area()函数用于输出正方形的面积,具体代码如下。使用remove()函数删除文件a.txt的示例使用remove()函数删除文件a.txt的示例defget_width():

print("get_width开始执行")num=int(input("请输入除数:"))width_len=10/num

print("get_width执行结束")returnwidth_lendefcalc_area():

print("calc_area开始执行")width_len=get_width()print("calc_area执行结束")returnwidth_len*width_lendefshow_area():

try:print("show_area开始执行")area_val=calc_area()print(f"正方形的面积是:{area_val}")print("show_area执行结束")exceptZeroDivisionErrorase:print(f"捕捉到异常:{e}")show_area()9.3.3异常的传递在get_width()函数中,使用变量num接收用户输入的除数,通过语句width_len=10/num计算正方形的边长,如果num的值为0,那么会使程序产生异常ZeroDivisionError。因为get_width()函数中并没有捕获处理异常的try-except语句,所以get_width()函数中产生的异常向上传递给calc_area()函数,而calc_area()函数中也没有捕获与处理异常的try-except语句,只能将异常继续向上传递给show_area()函数。9.3.3异常的传递自定义列表9.4

先定一个小目标!9.4自定义列表掌握自定义异常的方式,能够在程序中自定义并处理异常9.4自定义列表虽然Python提供了许多内置的异常类,但是在实际开发过程中可能出现的问题难以预料,有时我们需要自定义异常类,以满足当前程序的需求。例如,用户在注册账户时需要限定用户名或密码等信息的类型和长度。自定义异常的方法比较简单,只需要创建一个继承Exception类或Exception子类的类即可,类名一般以“Error”为结尾。9.4自定义列表通过一个用户注册密码长度限制的示例演示自定义异常。classShortInputError(Exception):def__init__(self,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论