1、Python3 程序设计 主讲教师:10 异常处理软件工程师系列Python3 程序设计程序设计第10章 异常处理 本章内容本章内容 异常处理概述 PYTHON的异常类 异常处理机制 抛出异常 断言与上下文管理 自定义异常Python的异常处理机制使得程序运的异常处理机制使得程序运行时出现的问题以统一的方式进行行时出现的问题以统一的方式进行处理,增加了程序的稳定性和可读处理,增加了程序的稳定性和可读性,规范了程序的设计风格,提高性,规范了程序的设计风格,提高了程序质量。了程序质量。软件工程师系列Python3 程序设计程序设计10.1 异常处理概述 异常的概念异常的概念 异常(Exceptio
2、n)就是程序在运行过程中发生的,由于硬件故障、软件设计错误、运行环境不满足等原因导致的程序错误。比如网络中断、文件找不到等 代码运行时如果发生了异常,将生成代表该异常的一个对象,并交由Python解释器寻找相应的代码来处理这一异常。Python异常处理优点 异常处理代码和正常执行的程序代码分离 多个异常统一处理,具有灵活性 可以从try-except之间的代码段中快速定位异常出现的位置软件工程师系列Python3 程序设计程序设计10.1 异常处理概述 异常异常示例示例1#ex1001.py2weekday=Mon,Tues,Weds,Thurs,Fri,Sat,Sun3 print(week
3、day2)4 print(weekday7)try:weekday=Mon,Tues,Wed,Thurs,Fri,Satur,Sun print(weekday2)print(weekday7)except IndexError:print(列表索引可能超出范围)软件工程师系列Python3 程序设计程序设计10.2 Python的异常类 Python中所有的异常类都是中所有的异常类都是Exception的子类。的子类。1.NameError尝试访问一个未声明的变量,会引发 NameError异常。2.ZeroDivisionError当除数为零的时候,会引发ZeroDivisionError
4、异常。3.IndexError当引用序列中不存在的索引时,会引引发IndexError异常。4.KeyError当使用映射中不存在的键时,会引发 Keyerror异常。软件工程师系列Python3 程序设计程序设计10.2 Python的异常类 Python中所有的异常类都是中所有的异常类都是Exception的子类。的子类。5.AttributeError当尝试访问未知的对象属性时,会引发AttributeError异常。6.SyntaxError当解释器发现语法错误时,会引发SyntaxError异常。7.FileNotFoundError试图打开不存在的文件时,会引发FileNotFou
5、ndError异常。软件工程师系列Python3 程序设计程序设计10.3 异常处理机制(1)程序执行过程中如果出现异常,会自动生成一个异常对象,该异常对象被提交给Python解释器,这个过程称为抛出异常。抛出异常也可以由用户程序自行定义。(2)当Python解释器接收到异常对象时,会寻找处理这一异常的代码并处理,这一过程叫捕获异常。(3)如果Python解释器找不到可以处理异常的方法,则运行时系统终止,应用程序退出。软件工程师系列Python3 程序设计程序设计10.3 异常处理机制 try-except语句语句 用于处理异常,帮助用户准确定位异常发生的位置和原因。格式如下。try:语句块e
6、xcept ExceptionName1:异常处理代码1except ExceptionName2:异常处理代码2软件工程师系列Python3 程序设计程序设计10.3 异常处理机制 try-except语句语句(1)try语句指定捕获异常的范围,由try所限定的代码块中的语句在执行过程中,可能会生成异常对象并抛出。(2)except语句每个try代码块必须有一个或多个except语句,用于处理try代码块中所生成的异常。except语句后的参数指明它能够捕获的异常类型。except块中包含的是异常处理的代码。例10-3 基本的异常处理示例。软件工程师系列Python3 程序设计程序设计10.
7、3 异常处理机制 else语句和语句和finally语句语句 完整的异常处理结构还可以包括else语句和finally语句。try:语句块except ExceptionName:异常处理代码#except可以有多条语句else:无异常发生时的语句块finally:必须处理的语句块软件工程师系列Python3 程序设计程序设计10.3 异常处理机制 else语句和语句和finally语句语句1.else语句与循环中的else语句类似,当try语句没有捕获到任何异常信息,将不执行except语句块,而是执行else语句块。2.finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的
8、其他部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常,finally块中的语句都会被执行。例例10-4 else语句示例。语句示例。例例10-5 finally语句示例。语句示例。软件工程师系列Python3 程序设计程序设计10.3 异常处理机制 捕获所有的异常捕获所有的异常 为了解决程序中会可能存在多处错误情况,可以在except语句中不指明异常型,这样它就可以处理任何类型的异常。异常处理可以不断细化。例8-6 通过except语句捕获所有的异常。在except语句后使用Exception类。由于Exception类是所有异常类的父类,因此可以捕获所有的异常。定义
9、一个Exception的对象result(任意合法的标识符)用于接收异常处理对象,从而输出异常信息。因为程序已经捕获了异常信息,并不会再出现因为异常而退出的情况。例8-7 使用Exception类的对象捕获所有的异常。软件工程师系列Python3 程序设计程序设计10.3 异常处理机制 捕获所有的异常捕获所有的异常软件工程师系列Python3 程序设计程序设计10.4 抛出异常在 Python中,除了程序运行出现错误时会引发异常外,也可以使用raise语句主动抛出异常,抛主要的应用场景是用户自定义异常。raise语句语句 使用 raise语句能显示地抛出异常,基本格式如下。raise异常类#抛
10、出异常,并隐式地创建类对象raise异常类对象#抛出异常,创建异常类的实例对象raise#重新抛出刚刚发生的异常软件工程师系列Python3 程序设计程序设计10.4 抛出异常1.使用类名引发异常 当 raise语句指定异常的类名时,会创建该类的实例对象,然后引发异常。2.使用异常类的实例引发异常 通过显式地创建异常类的实例,直接使用该实例对象来引发异常。3.传递异常 不带任何参数的raise语句,可以再次引发刚刚发生过的异常,作用就是向外传递异常。4.指定异常的描述信息 当使用raise语句抛出异常时,还可以给异常类指定描述信息。软件工程师系列Python3 程序设计程序设计10.4 抛出异
11、常 抛出异常示例抛出异常示例 用户的应用程序中也可以抛出异常,但需要生成异常对象。生成异常对象一般都是通过raise语句实现的。例10-9拟现金支付功能,当支付额度大于5000时,抛出ValueError异常,当额度低于5000时,按照额度的10%扣税。软件工程师系列Python3 程序设计程序设计10.5 断言与上下文管理断言与上下文管理两种特殊的异常处理方式,在形式上比异常处理结构简单,能够满足简单的异常处理和条件确认,并且可以和标准的异常处理结构结合使用。断言断言 assert语句又称作断言语句,指的是用户期望满足指定的条件。当用户定义的约束条件不满足的时候,它会触发AssertionE
12、rror异常。assert逻辑表达式,description在上面格式中,assert后面是一个逻辑表达式,相当于条件。description是可选的,通常是一个字符串。flag=True assert flag=False,flag初始值错误软件工程师系列Python3 程序设计程序设计10.5 断言与上下文管理断言与上下文管理 上下文管理上下文管理 使用上下文管理语句with可以自动管理资源,代码块执行完后,自动还原进入该代码块之前的现场或上下文。不论何种原因跳出with块,也不论是否发生异常,总能保证资源被正确释放,简化了工作。多用于打开文件、连接网络、连接数据库等场合。with 表达式
13、 as variable:with语句块软件工程师系列Python3 程序设计程序设计10.5 断言与上下文管理断言与上下文管理 上下文管理上下文管理例如,下面的代码在文件操作时使用例如,下面的代码在文件操作时使用with上下文管理语句,当上下文管理语句,当文件处理完以后,将会自动关闭。文件处理完以后,将会自动关闭。fname=d:pythonfile36aaaa.txtwith open(fname)as file:for line in file:print(line,end=)软件工程师系列Python3 程序设计程序设计10.6 自定义异常 应用场景应用场景 某个应用所特有的运行错误,
14、需要编程人员根据程序的逻辑在用户程序中创建用户自定义的异常类和异常对象。用来处理程序中可能产生的逻辑错误,使得这种错误能够被系统及时识别并处理,而不致扩散产生更大的影响,从而使用户程序更为强健,有更好的容错性能,并使整个系统更加安全稳定。创建用户自定义创建用户自定义异常需要异常需要完成如下的工作。完成如下的工作。(1)声明一个新的异常类,使之以Exception类或其他某个已经存在的系统异常类或用户异常类为父类。(2)为新的异常类定义属性和方法,或重载父类的属性和方法,使这些属性和方法能够体现该类所对应的错误的信息。软件工程师系列Python3 程序设计程序设计8.6 自定义异常 应用场景应用
15、场景 某个应用所特有的运行错误,需要编程人员根据程序的逻辑在用户程序中创建用户自定义的异常类和异常对象。用来处理程序中可能产生的逻辑错误,使得这种错误能够被系统及时识别并处理,而不致扩散产生更大的影响,从而使用户程序更为强健,有更好的容错性能,并使整个系统更加安全稳定。创建用户自定义创建用户自定义异常需要异常需要完成如下的工作。完成如下的工作。(1)声明一个新的异常类,使之以Exception类或其他某个已经存在的系统异常类或用户异常类为父类。(2)为新的异常类定义属性和方法,或重载父类的属性和方法,使这些属性和方法能够体现该类所对应的错误的信息。软件工程师系列Python3 程序设计程序设计
16、10.6 自定义异常 例例10-11个用户自定义异常的示例个用户自定义异常的示例。代码包括3部分 第1部分是关于异常类的定义,该类继承了Exception类,第2部分代码是自定义异常的业务逻辑,模拟当支取金额大于500时,报告异常;第3部分是测试代码。软件工程师系列Python3 程序设计程序设计软件工程师系列Python3 程序设计程序设计小结 异常(Exception)就是程序在运行过程中发生的,由于硬件故障、软件设计错误、运行环境不满足等原因导致的程序错误事件。Python中所有的异常类都是Exception的子类。Python常用的内置异常类包括NameError、ZeroDivisi
17、onError、IndexError、KeyError、AttributeError、SyntaxError、FileNotFoundError等。Python通过try-excep-else-finally语句处理异常,帮助用户准确定位异常发生的位置和原因。软件工程师系列Python3 程序设计程序设计小结 通过在except语句中不指明异常型来处理任何类型的异常,为了能区分来自不同语句的异常,在except语句后使用Exception类,并定义一个Exception的对象用于接收异常处理对象,从而输出异常信息。Python使用raise语句主动抛出异常,抛出异常主要的应用场景是用户自定义异常。assert语句又称作断言语句,用于处理在形式上比较简单的异常。使用上下文管理语句with可以自动管理资源,多用于打开文件、连接网络、连接数据库等场合。软件工程师系列Python3 程序设计程序设计作业:(1)定义一个Circle类,其中有求面积的方法,当半径小于0时,抛出一个用户自定义异常。(2)从键盘输入一个整数,求100除以它的商,并显示。要求对从键盘输入的数值进行异常处理。软件工程师系列Python3 程序设计程序设计