




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章异常处理8.5断言8.4自定义异常和抛出异常8.2异常类8.6案例实战8.3异常处理8.1错误与异常
程序运行时常常会引发错误,引发错误的原因有很多,例如除零、下标越界、文件不存在、网络异常、类型错误、名字错误、字典键错误、磁盘空间不足,等等。如果这些错误得不到正确的处理将会导致程序终止运行,而合理地使用异常处理结果可以使得程序更加健壮,具有更强的容错性,不会因为用户不小心的错误输入或其他运行时原因而造成程序终止。也可以使用异常处理结构为用户提供更加友好的提示。程序出现异常或错误之后是否能够调试程序并快速定位和解决存在的问题也是程序员综合水平和能力的重要体现方式之一。8.1错误与异常8.1错误与异常
Python至少有两类不同的错误:语法错误(SyntaxErrors)和异常(Exceptions)。语法错误,也叫解析错误,是我们最不愿意发生的错误,如下面的例子:>>>whileTrueprint('Helloworld')SyntaxError:invalidsyntax例子中的语法错误就是在print前少了冒号(这是一个死循环)。程序执行过程中,Python解释器会检测你的程序是否存在语法错误,如果程序出错Python解释器会指出出错的一行,并且在最先找到的错误的文字进行标记颜色或小箭头。8.1错误与异常一个语句或者一个表达式即使编译时是没有语法错误的,但是也有可能在执行时出现问题,这种问题也叫异常(非致命性),异常通常都是有在程序中进行处理的。异常是有不同类型的,常见的异常类型有:ZeroDivisionError、
NameError
、
TypeError等这类异常称为标准异常。8.1错误与异常还有一类异常是用户自定义的。异常是一个事件,该事件会在程序执行过程中发生,影响程序的正常执行。一般情况下,在Python无法正常处理程序时就会抛出一个异常。异常是Python的对象,表示一个错误。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。8.2异常类8.2异常类在Python中,所有的异常类都是Exception的子类,且都在exceptions模块中定义。Python自动将所有异常名称放在内建命名空间中,所以程序不必导入exceptions模块即可使用异常。Python常见异常类型如表所示。8.2异常类异常名称描述Exception常规错误的基类BaseException
所有异常的基类ZeroDivisionError除(或取模)零
(所有数据类型)NameError未声明/初始化对象
(没有属性)SyntaxError语法错误IndexError序列中没有此索引(index)KeyError映射中没有这个键FileNotFoundError文件未找到AttributeError对象没有这个属性ValueError传入无效的参数8.3异常处理8.3异常处理Python解释器检测到程序出现的错误,触发异常,需要编写特定的代码去进行异常处理,用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)。如果捕捉成功则进入另外一个处理分支,执行为其定制的逻辑,使程序不会崩溃,这就是异常处理。8.3异常处理8.3.1捕获指定异常Python的异常捕获常用try...except结构,把可能发生错误的语句放在try模块里,用except来处理异常,每一个try,都必须至少对应一个except。try...except语法格式如下:try:
可能引发异常的代码块except异常类型名称:
异常处理代码块8.3异常处理s="HelloPython!"try:print(s[100])exceptIndexError:print("IndexError...")print("Continue")try子句打印一个不存在的字符串的索引值,except试图捕获这个异常。输出结果:IndexError...Continue8.3异常处理如果没有对异常进行任何预防,那么在程序执行的过程中发生无索引异常,就会中断程序,并在终端输出异常信息,IndexError:stringindexoutofrange。反之,程序执行时进入try语句块,发生IndexError异常,会寻找后面是否有except语句。找到except语句后,except将捕获这个异常,处理完毕后,程序继续往下执行。这种情况下,不会中断程序。8.3异常处理8.3.2捕获多个异常捕获多个异常有三种方式。第一种是一个except同时处理多个异常类型,不区分优先级,格式如下:try:
可能引发异常的代码块except(<异常类型1>,<异常类型2>,...):
异常处理代码块8.3异常处理第二种是区分异常类型的优先级,格式如下:try:
可能引发异常的代码块except<异常类型1>:
异常处理代码块except<异常类型2>:
异常处理代码块…8.3异常处理。异常处理结构的语法规则是:执行try下的语句,如果引发异常,则执行过程会跳到第一个except语句;如果第一个except中定义的异常与引发的异常匹配,则执行该except中的语句;如果引发的异常不匹配第一个except,则会搜索第二个except,允许编写的except数量没有限制;如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。8.3异常处理第三种是捕获所有类型的异常,格式如下:try:
可能引发异常的代码块except:
异常处理代码块8.3异常处理。示例如下:try:num1=input("请输入第1个数:")num2=input("请输入第2个数:")print(int(num1)/int(num2))exceptZeroDivisionError:print("第2个数不能为0")exceptValueError:print("只能输入数字")请输入第1个数:0请输入第2个数:a只能输入数字8.3异常处理。8.3.3未捕获到异常带else子句的异常处理结构也是一种特殊形式的选择结构。如果try中的代码抛出了异常,并且被某个except捕获,则执行相应的异常处理代码,这种情况下不会执行else中的代码;如果try中的代码没有抛出任何异常,则执行else子句中的代码块。8.3异常处理。如果使用else子句,那么必须放在所有的except子句之后,这个else子句将在try子句没有发生任何异常的时候执行。语法格式如下:try:
可能引发异常的代码块except<异常类型1>:
异常处理代码块…else:
代码块
#try语句中没有异常则执行此段代码8.3异常处理示例如下:s='5'try:int(s)exceptExceptionase:print(e)else:print("NoException")运行程序,输出未捕获异常的描述信息:NoException8.3异常处理8.3.4try...except...finallytry...except...finally语句无论是否发生异常,都将会执行最后的finally子句中的语句块,通常是进行清理工作。
try: …… finally: …… #无论如何都会执行8.3异常处理s='Python'try:int(s)exceptExceptionase:print(e)else:print("try内代码块没有异常则执行")finally:print("无论异常与否,都会执行该finall语句")8.4自定义异常和抛出异常
8.4自定义异常和抛出异常实际开发中,有时系统提供的异常类型不能满足开发的需求。这时可以通过创建一个新的异常类来拥有自定义的异常。异常类继承自Exception类,可以直接继承,或者间接继承。系统的自带的异常只要触发会自动抛出,比如NameError,但用户自定义的异常需要用户自己决定什么时候抛出。
8.4自定义异常和抛出异常当程序出现错误,Python会自动引发异常,也可以通过raise显示地抛出异常。基本格式如下:raise异常类
#引发异常时会隐式的创建对象raise异常类对象
#引发异常类实例对象对应的异常raise #重新引发刚刚发生的异常raise唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是Exception的子类)。大多数的异常的名字都以"Error"结尾,所以实际命名时尽量跟标准的异常命名一样。
8.4自定义异常和抛出异常classCustomError(Exception): #自定义异常类,继承Exceptiondef__init__(self,ErrorInfo,name,age):super().__init__(self) #初始化父类self.errorinfo=ErrorInfo=nameself.age=agedef__str__(self): #打印实例化对象调用returnself.errorinfoif__name__=='__main__':try:raiseCustomError('客户异常',"张三",18) #主动抛出异常exceptCustomErrorase: #捕获CustomError类携带的信息print(e,,e.age)8.5
断言
8.5断言使用assert断言是学习Python一个非常好的习惯,assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达式为假,这是系统会抛出AssertionError异常。assert的语法格式为:assertexpression,data上述格式中,assert后面紧跟一个逻辑表达式expression,相当于条件。data通常是一个字符串,当表达式的结果为False时,作为异常类型的描述信息使用。
它的等价语句为:ifnotexpression:raiseAssertionError
8.5断言断言的示例如下:>>>assert2<1,"出现错误了!"Traceback(mostrecentcalllast):File"<pyshell#5>",line1,in<module>assert2<1,"出现错误了!"AssertionError:出现错误了!8.6
案例实战
8.6案例实战1.案例描述在程序运行的过程中,如果发生了错误,可以捕获异常,也可以抛出异常。设计一个程序,在异常处理中同时捕获异常和抛出异常的描述信息。2.案例实现8.6案例实战classTest(object):def__init__(self,switch):self.switch=switch #开关defcalc(self,a,b):try:returna/bexceptExceptionasresult:ifself.switch:print("捕获开启,已经捕获到了异常,信息如下:")print(result)else:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB3709T 039-2025 泰山灵芝-羊肚菌周年轮作栽培技术规程
- 福建装配式钢板仓施工方案
- 进入自然保护区施工方案
- 氧气管道脱脂施工方案
- 采光井加阳光房施工方案
- 街道巷口硬化施工方案
- 吉林展会装潢施工方案
- 耐高温超轻硅酸钙隔热保湿材料项目风险识别与评估综合报告
- 马鞍山打地热井施工方案
- 智研咨询发布:中国城市矿产行业市场现状及投资前景分析报告
- 机电控制与可编程序控制器课程设计
- 布朗德战略导向的薪酬管理体系
- SOP标准作业指导书样板
- 食品经营餐饮操作流程(共1页)
- JTS 144-1-2010 港口工程荷载规范
- 产液剖面介绍
- 弯矩二次分配法EXCEL计算
- 美国UNF和unc螺纹标准
- 童话故事《老鼠搬鸡蛋》.ppt
- 河北省省直行政事业单位资产(房屋)租赁合同书(共7页)
- 220kV、110kV设备基础施工方案
评论
0/150
提交评论