Python——异常处理
文章目录
- 异常
- Python中的异常类
- 捕获与处理异常
- 自定义异常类
- with语句
- 断言
异常
- 异常是在程序执行过程中发生的影响程序正常执行的一个事件。
- 异常是Python对象,当Python无法正常处理程序时就会抛出一个异常。一旦Python脚本发生异常,程序需要捕获并处理它,否则程序会终止执行。
- 异常处理使程序能够处理完异常后继续它的正常执行,不至于使程序因异常导致退出或崩溃。
while True:try:price=float(input("请输入价格:"))print('价格为:%5.2f' % price)breakexcept ValueError:print('您输入的不是数字。')
程序运行结果:
请输入价格:x
您输入的不是数字。
请输入价格:y
您输入的不是数字。
请输入价格:12.989
价格为:12.99
- 上述程序运行时,当在提示符下输入非数字时,float()函数将产生一个ValueError异常。try块中检测到ValueError异常后,终止try中后续代码的执行,转而执行异常处理代码,也就是执行except ValueError语句后面的代码。处理完异常后,继续从while语句的开始部分执行。只要输入的是非数字,float()函数都将产生ValueError异常,break语句不会执行,循环一直继续,程序反复要求用户输入正确的数字。
- 直到用户输入正确的数字后,float()函数不会抛出ValueError异常,try模块中的代码继续往下执行,直到执行break语句后,退出while循环。
Python中的异常类
- Python程序出现异常时将抛出一个异常类的对象。
- Python中所有异常类的根类是BaseException类,它们都是BaseException的直接或间接子类。大部分常规异常类的基类是Exception的子类。
- 不管程序是否正常退出,都将引发SystemExit异常。例如,在代码中的某个位置调用了sys.exit()函数时,将触发SystemExit异常。利用这个异常,可以阻止程序退出或让用户确认是否真的需要退出程序。
- KeyboardInterrupt异常是因用户按下Ctrl+C组合键来终止命令行程序而触发。
捕获与处理异常
- try/except语句用来检测try语句块中的异常,让except语句捕获异常信息并处理。如果不想在异常发生时结束程序,只需要在try里捕获它,并在except中处理捕获到的异常。
try:<可能出现异常的语句块>
except <异常类名字name1>:<异常处理语句块1> #如果在try部份引发了'name1'异常,执行这部分语句块
except <异常类名字name2> as e1:<异常处理语句块2> #如果在try部份引发了'name2'异常,执行这部分语句块
except < (异常类名字name3, 异常类名字name4, …)> as e2:<异常处理语句块3> #如果引发了'name3'、'name4'、…中任何一个异常,执行该语句块
…
except:<异常处理语句块n> #如果引发了异常,但与上述异常都不匹配,执行此语句块
else:<else语句块> #如果没有上述所列的异常发生,执行else语句块
finally:<任何情况下都要执行的语句块>
- try中的语句块先执行。如果try语句块中的某一语句执行时发生异常,Python就跳到except部分,从上到下判断抛出的异常对象是否与except后面的异常类相匹配,并执行第一个匹配该异常的except后面的语句块,异常处理完毕。
- 如果异常发生了,但是没有找到匹配的异常类别,则执行不带任何匹配类型的except语句后面的语句块,异常处理完毕。
- 如果try语句块的某一语句里发生了异常,却没有匹配的except子句,也没有不带匹配类型的except部分,则异常将往上被递交到上一层的try/except语句进行异常处理,或者直到将异常传递给程序的最上层,从而结束程序。
- 如果try语句块中的任何语句在执行时没有发生异常,Python将执行else语句后的语句块。
- 执行完except后的异常处理语句或else后面的语句块后,程序一定会执行finally后面的语句块。这里的语句块主要用来进行收尾操作,无论是否出现异常都将被执行。
- 一个异常处理模块至少有一个try和一个except语句块,else和finally语句块是可选的。
try:x=float(input('请输入设备成本:'))y=int(input('请输入分摊年数:'))z=x/yprint('每年分摊金额为%.2f'% z)
except ZeroDivisionError:print("发生异常,分摊年数不能为0.")
except:print('输入有误')
else:print("没有错误或异常")
finally:print('不管是否有异常发生,始终执行finally部分的语句')
如果在终端以正确的格式输入,则except后面的模块均不会执行,else后的模块会得到执行,finally后面的模块语句会执行。程序运行结果如下:
请输入设备成本:15
请输入分摊年数:3
每年分摊金额为5.00
没有错误或异常
不管是否有异常发生,始终执行finally部分的语句
如果在终端输入的被除数为0,则会检测到ZeroDivisionError异常对象,在except ZeroDivisionError之后的模块会得到执行来处理该异常。异常处理完成后,执行finally后面的语句块。程序运行结果如下:
请输入设备成本:15
请输入分摊年数:0
发生异常,分摊年数不能为0.
不管是否有异常发生,始终执行finally部分的语句
如果在终端只输入除数,没有输入被除数,try模块中将抛出TypeError异常。在程序的异常处理except中没有列出该类型异常的处理程序模块,但是TypeError是except的子类,因此不带异常类型的except模块能够拦截该异常进行处理。异常处理结束后,finally后面的语句也会得到执行。程序运行结果如下:
请输入设备成本:15
请输入分摊年数:
输入有误
不管是否有异常发生,始终执行finally部分的语句
自定义异常类
- 异常处理流程一般包括三个步骤:
- 将可能产生异常的代码段放在try代码块中;
- 出现特定情况时抛出(raise)异常;
- 在except部分捕获并处理异常。
- 笔记前面部分案例使用的标准模块中的异常都是由系统自动抛出,隐藏了异常抛出的步骤。
- 仅仅使用标准模块中的异常类通常不能满足系统开发的需要,有时候需要自定义一些异常类。系统无法识别自定义的异常类,只能在程序中显式地使用raise抛出异常。可以通过BaseException类或其子类来创建自定义异常类。
- 如下程序清单给出了一个自定义类InvalidNumberError,该类继承自类ArithmeticError。
- 因为InvalidNumberError是一个自定义类,因此需要使用raise来显式地抛出异常。自定义异常的其他使用方法与标准模块中的异常类使用方法相同。
with语句
- with语句是其中一个隐藏低层次抽象的方法。目的是简化类似于try-except-finally这样的代码。
- try-except-finally通常用于保证资源的唯一分配,并在任务结束时释放资源,如线程资源、文件、数据库连接等。在这些场合下使用with语句将使代码更加简洁。with语句的语法如下:
with context-expression [as var]:with语句块
为了读取、打印该文件中的所有内容,并确保程序在出现异常时也能正确关闭文件对象,使用try-finally的程序:
try:f=open('testwith.txt','r')for line in f:print(line,end='')
finally:f.close()
- 使用try-finally语句来确保当try语句块中出现异常时,f.close()语句能够得到执行。如果采用with语句,程序结构将得到进一步的简化。
with open('testwith.txt','r') as f:for line in f:print(line,end='')
由于使用了with语句,不需要try-finally语句来确保文件对象的关闭。无论该程序是否出现异常,文件对象都将由系统自动关闭。
- 并不是所有的对象都支持with语句这一新的特性。只有支持上下文管理协议的对象才能使用with语句。
- 第一批支持该协议的对象有:file、decimal.Context、thread.LockType、threading.Lock、threading.RLock、threading.Condition、threading.Semaphore、threading.BoundedSemaphore。
断言
断言从Python1.5版本开始引入,是申明表达式为真的判定。如果表达式为假则抛出异常。断言语句可以理解为raise-if-not语句,用来测试表达式,如果表达式为假,则触发AssertionError异常;如果表达式为真,也就是断言成功,则程序不采取任何措施。断言的语法格式如下:
assert expression [, arguments]
其中expression是断言表达式;arguments是断言表达式为假时传递给AssertionError对象的字符串。
- 以下两个例子演示了assert语句后面表达式分别为真与假时的运行结果。
和其他异常一样,AssertionError也可以通过try-except来捕获。如果没有捕获,该异常将终止程序的运行。 - 下面程序演示了利用try-except捕获AssertionError异常的方法。
Python——异常处理相关推荐
- python示例异常处理与程序调试_笔记:Python异常处理与程序调试
Python异常处理与程序调试 Python提供了强大的异常处理机制,通过捕获异常可以提高程序的健壮性.异常处理还具有释放对象,中止循环的运行等作用.在程序运行的过程中,如果发生了错误,可以返回事先约 ...
- Python 异常处理--raise函数用法
Python 异常处理--raise函数用法 参考文章: (1)Python 异常处理--raise函数用法 (2)https://www.cnblogs.com/darkgui34/p/405074 ...
- python异常处理--try except else raise finally
python异常处理--try except else raise finally 参考文章: (1)python异常处理--try except else raise finally (2)http ...
- python 异常处理 try except
python 异常处理 try except 参考文章: (1)python 异常处理 try except (2)https://www.cnblogs.com/brave1/p/10252739. ...
- python异常处理(基础)
python异常处理(基础) 参考文章: (1)python异常处理(基础) (2)https://www.cnblogs.com/fnng/p/3518202.html 备忘一下.
- python处理流程-Python异常处理大全(二)
原标题:Python异常处理大全(二) 本文是Python异常处理教程的第二部分,上部分我们简单的介绍了几种异常,及其处理办法,这部分我们将更详细地对Python中产生的异常处理方法进行探讨. 函数使 ...
- 十一、Python异常处理
Python异常处理 异常抛出机制,为程序开发人员提供了一种在运行时发现错误,进行回复处理,然后继续执行的能力 #!/usr/bin/python try: open('abc.txt') excep ...
- Python异常处理体系简介(1)
http://developer.51cto.com/art/200902/111535.htm Python异常处理体系 1.Python内建异常体系结构 The class hierarchy f ...
- python异常处理_汇总三大python异常处理、自定义异常、断言原理与用法分析
本文实例讲述了python异常处理.自定义异常.断言原理与用法.分享给大家供大家参考,具体如下: 什么是异常: 当程序遭遇某些非正常问题的时候就会抛出异常:比如int()只能处理能转化成int的对象, ...
- 【Python】1054 求平均值(Python异常处理练习)
1. 题目 2. 代码 重坑,读题不仔细,导致耗时多. 题目中合法数字当只用一个的时候,输出的结果中的是number,而不是numbers # https://pintia.cn/problem-se ...
最新文章
- 本地实现ES6转ES5代码——gulpfile配置文件
- 使用IB_DESIGNABLE与IBInspectable特性实现可在视图编辑器的功能栏中设置
- 4 Skills that will Dramatically Increase Your Chance of Thriving as a Multipotentialite2017-12-09
- NAS服务器局域网内IPad、手机、电视盒子等联网播放
- 机器学习之数据预处理——归一化,标准化
- SpringBoot自动配置原理流程
- 虚拟服务器选那个存储好,如何选择虚拟环境中的存储?
- 人工智能/数据科学比赛汇总 2019.2
- SSH框架和Redis的整合(1)
- 【Java从0到架构师】Spring - 纯注解开发
- 易百教程(IT技能学习平台)
- 御坂搜索引擎_MisakaTranslator下载|MisakaTranslator御坂翻译器 v2.1 正式整合版下载
- oppo手机硬件测试软件,OPPO怎么测试手机硬件,只需要做这一步,进入工程模式...
- 【回归分析】[3]--回归方程的显著性检验
- 富盛企业经营分析软件操作手册下载
- 无障碍键盘输入-搜狗输入法写数学公式
- 页面底部copyright部分制作过程中遇到的问题,解决以及总结
- 关于华为的高薪和华为的加班
- 微信双开是定时炸弹?关于非越狱iOS上微信分身高危插件ImgNaix的分析 1
- c语言管道通信实例,C语言辅导:VC命名管道通信的实现