版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Python程序设计实用教程xxx第10章异常处理本章要点异常概述Python异常处理结构自定义异常断言与上下文管理Python异常是指在程序运行中所产生的错误,这个错误可以是Python内置的错误类型,也可以是开发者自定义的错误类型。
一般情况下,在Python无法正常处理程序时就会发生一个异常。异常是一个事件,会影响程序的执行流程,若没有用正确的方式捕获产生的异常,代码就会终止运行。10.1异常概述
异常是指程序运行时引发的错误。引发错误的原因有很多,例如除零、下标越界等。如果这些错误得不到正确的处理将会导致程序终止运行。
合理地使用异常处理结构可以使得程序更加健壮,具有更强的容错性,不会因为用户不小心的错误输入或其他运行时的原因而造成程序终止,也可以使用异常处理结构为用户提供更加友好的提示。
总的来说,编写程序时遇到的错误可大致分为2类,分别为语法错误和运行时错误。在Python中,把这种运行时产生错误的情况叫做异常(Exceptions)。【例10.1】产生异常的情况示例程序。#将一个字母转换为整型。这时Python会自动抛出TypeError异常。>>>int("Python")Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>ValueError:invalidliteralforint()withbase10:'Python'#从字典中取一个不存在的键,Python会自动抛出KeyError异常。>>>dict_demo={}>>>key_demo=dict_demo["fun"]Traceback(mostrecentcalllast):
File"<stdin>",line1,in<module>KeyError:'fun'
这里出现的TypeError和KeyError都是Python内置的异常类型,它们都继承自父类Exception。10.2Python异常处理结构try...except...结构在Python异常处理结构中使用得最为频繁,
其中try子句中的代码为可能引发异常的语句,except语句捕获相应的异常。也可为理解为,当try子句代码执行异常并且被捕获时,执行except子句语块。10.2.1try…except语句语句结构try:
语句块 #被监控的语句exceptException[asreason]:
语句块 #处理异常的语句
try:后面的语句为被被监控的try块,当这部分语句发生异常时,抛出的异常在except子句后面处理。except子句可以在异常类名字后指定一个变量。try:raiseException('spam','eggs')exceptExceptionasinst:print(type(inst))#theexceptioninstanceprint(inst.args)#argumentsstoredin.argsprint(inst)#__str__allowsargstobeprinteddirectly,#butmaybeoverriddeninexceptionsubclasses
如果try中的代码抛出了异常并被except捕获,就执行except块。【例10.2】try...except…else异常处理语句示例程序。a_list=['中国','美国','英国','法国','俄罗斯']whileTrue:
n=input('请输入字符串的序号:')
try:
n=int(n)
print(a_list[n])
exceptIndexError:
print('列表的下标必须为[0,4]之间的整数')
else:break如果try中的代码没有抛出异常,就执行else块。【例10.3】打开一个文件,在该文件中的内容写入内容,采用异常检测的程序。try:
fh=open("testfile.txt","r")
fh.write("这是一个测试文件,用于测试异常!!")exceptIOError:
print("Error:没有找到文件或读取文件失败")else:
print("内容写入文件成功")fh.close()
程序运行时,如果testfile.txt"文件不存在,则抛出异常,显示“Error:没有找到文件或读取文件失败”。如果文件存在,运行try语句块没有抛出异常,运行else后面的语句,显示“内容写入文件成功”。10.2.2多个except的try语句
带有多个except的try结构,捕获多个异常,当可能存在多个异常时,可以定义多个except来捕获多个异常,也可以在一个except中声明多个异常。定义多个except捕获多个异常语句:try...except...except...【例10.4】多个except的异常示例程序。try:
x=input('请输入被除数:')
y=input('请输入除数:')
z=float(x)/float(y)exceptZeroDivisionError:
print('除数不能为零')
exceptValueError:
print('被除数和除数应为数值类型')exceptNameError:
print('变量不存在')else:print(x,'/',y,'=',z)
程序运行时,如果除数为零,则抛出异常ZeroDivisionError,显示'除数不能为零',如果被除数,除数不是数字,抛出异常ValueError,显示'被除数和除数应为数值类型'。10.2.3try…except…finally语句Python异常处理机制还提供了一个finally语句,通常用来为try块中的程序做扫尾清理工作。在整个异常处理机制中,finally语句的功能是:无论try块是否发生异常,最终都要进入finally
语句,并执行其中的代码块。【例10.5】try…except…finally处理文件读取程序实例。try:f=open('read1.txt')exceptFileNotFoundErrorase:print(e)#[Errno2]Nosuchfileordirectory:'read1.txt'else:print("文件读写正常")finally:#无论程序是否有异常,都会走到finally分支
print("over")#over
程序运行时,如果文件read1.txt文件不存在,抛出异常[Errno2]Nosuchfileordirectory:'read1.txt',然后运行finally语句块,显示over。10.3自定义异常
通常可以继承Exception或子类。命名通常以Error和Exception为后缀。其过程为:
(1).定义异常类,从Exception类别继承。
(2).在try中使用raise语句会引起异常。
(3).except捕获异常,并执行相关命令。【例10.6】自定义的异常示例程序。class
ShortInputException(Exception):
def
__init__(self,
length,
atleast):
self.length
=
length
self.atleast
=
atleastdef
main():
try:
s
=
input('请输入
-->
')
if
len(s)
<
3:
#
raise引发一个自定义的异常
raise
ShortInputException(len(s),
3)
except
ShortInputException
as
result:#这个变量被绑定到了错误的实例
print('ShortInputException:
输入的长度是
%d,长度至少应是
%d'%
(result.length,
result.atleast))
else:
print('没有异常发生')main()
运行结果:
请输入-->aShortInputException:输入的长度是1,长度至少应是3
请输入-->python
没有异常发生
程序运行时,如果输入的字符串长度大于3,没有发生异常,运行else后面的语句,显示“没有异常发生”。如果输入的字符串长度小于3,则发生异常,采用raise引发一个自己定义的异常,显示自定义异常的内容。
10.4断言与上下文管理
断言与上下文管理是两种比较特殊的异常处理方式,在形式上比异常处理结构要简单一些。
断言一般用来判断一些bool语句,在断言成功时不采取任何措施,否则触发AssertionError(断言错误)的异常。1.断言
断言语句:assertexpression[,reason]当判断表达式expression为真时,什么都不做。如果表达式为假,则抛出异常。assert语句一般用于对特定必须满足的条件进行验证。【例10.7】断言示例程序。
a=3
b=5
asserta==b,'amustbeequaltob'运行结果:AssertionError:amustbeequaltob
采用try…except语句实现相同的处理。try:
asserta==b,'amustbeequaltob'exceptAssertionErrorasreason:print('%s:%s'%(reason.__class__.__name__,reason))运行结果:AssertionError:amustbeequaltob2.上下文管理
使用with自动关闭资源,可以在代码块执行完毕后,还原进入该代码块时的现场,不论何种原因跳出with块,不论是否发生异常,总能保证文件被正确关闭,资源被正确释放。with语句的语法如下:withcontext_expr[asvar]:
with块【例10.8】上下文关联示例程序,输出文本文件中的所有行。withopen("testfile.txt")asf:
forlineinf:
print(line,end="")
程序运行时,打开testfile.txt,读取文件中的内容,当退出with语句块时,自动关闭文件,不需要写显示的close(f)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 黄赌毒酒驾题库及答案
- 2026年中级会计职称考试仿真题及答案
- 2026年小孩乘坐电梯安全知识培训
- 2026年化学知识体系构建方法
- 第二十五讲 浪漫主义绘画说课稿2025学年高中美术人教版必修 艺术欣赏-人教版
- 2026年区块链安全防御编程题集
- 2026年高中英语会考模拟试卷
- 2026年新能源汽车检测与维修高级笔试模拟题
- 2026年笔试高频词汇记忆手册
- 2026年财务经理考试重点题库
- 公路隧道智慧建养技术
- 测量设备检定校准管理制度
- 2026年山东省潍坊市高考物理二模试卷(含解析)
- 成人有创通气院内转运安全共识课件
- 2026北京国研科技咨询有限公司浙江分公司招聘6人笔试备考试题及答案解析
- 2026年内蒙古自治区道路交通事故损害赔偿项目和计算办法
- 2026年体重管理师理论知识考核考前冲刺练习题及完整答案详解(夺冠)
- 2026届陕西省咸阳市高三上学期一模考试化学试卷
- 银行间业务风险隔离制度
- AI投标课件讲解
- 文明单位创建自查报告撰写指南
评论
0/150
提交评论