Python基础概念_10_异常处理
异常处理
11 异常处理
11.1 简介
程序是在某个条件下实现某个功能的指令集,如果执行的环境发生了变化那么程序可能会出异常。比如实现一个打开文件的功能,我们在上章里都是直接打开文件,但实际执行时文件可能不存在。如果对这个异常我们没有做处理,那么python会帮我们处理,不过显然系统给的系统对用户来说不是很友好,可读性不高。而且在没有加异常捕获时,程序遇到异常就终止了。所以一般我们都要对异常进行捕获,让程序更健壮,能适应各种异常的情况。
程序异常示例:
f =open("G:\\tmp\\xiaodao1.txt", "r")
f.read()
print("继续执行呢!")
执行结果:
Traceback (mostrecent call last):
File "FileOperate.py", line 20, in<module>
f = open("D:\\tmp\\xiaodao1.txt","r")
FileNotFoundError:[Errno 2] No such file or directory: 'D:\\tmp\\xiaodao1.txt'
注:此例中如下的代码在遇到异常时将不会被执行:
f.read()
print ("继续执行呢!")
11.2 处理异常
处理异常又成异常捕获,一般我们是通过try/except语句。该语句是用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。这样当我们的程序出现异常并捕获到后程序还是会继续执行。所以上节的代码我们修改如下:
try:
f = open("G:\\tmp\\xiaodao1.txt","r")
f.read()
exceptIOError:
print ("Error: 没有找到文件或读取文件失败")
print("尽管有异常,捕获后会继续执行呢!")
执行结果:
Error: 没有找到文件或读取文件失败
尽管异常,捕获后会继续执行呢!
如上是个捕获异常的简单例子,接下来我们结合try/except的语法来详细介绍下异常捕获的常用处理处理方法。
11.2.1 tryexcept else语句
语法见下:
try:
Normal execution block(代码块)
except A:
Exception A handle(异常A的具体处理方法)
except B:
Exception B handle(异常B的具体处理方法)
except:
Other exception handle(其它异常的具体处理方法)
else:
if no exception,get here(如果没有异常则处理)
finally:
final execution block (不论是否异常都会被执行到)
执行顺序说明:
正常时程序会执行try里面的Normal execution block,当出现异常时,则会中断当前Normalexecution block中的执行跳转到对应的异常处理块里执行异常处理的代码。python从第一个except X处开始查找,如果找到了对应的exception类型则进入该异常里的处理。如果没有找到则直接进入except块处进行处理。
注:
1) 上面语法里的except块是个可选项,如果代码里没有出现,该异常将会被提交给python进行默认处理,处理方式则是终止应用程序并打印提示信息。
2) 异常里的代码执行顺序是 try-->exceptX-->except-->else-->finally。其中except是except X没找到时执行,else是没有异常时执行,finally是无论有没有异常都会执行。
代码示例:
如下是个键盘接受用户输入的程序
try:
text = input('请输入些单词')
exceptEOFError:
print('你为什么输入个EOF(windows里按ctrl+z,linux里是ctrl+c)给我?')
exceptKeyboardInterrupt:
print('你输出了取消键ctr+c')
else:
print('你输入了 {0}'.format(text))
finally:
print('无论是否异常最终都会被执行finally!')
执行结果:
1) 场景一输入ctrl+z模拟程序终止
请输入些单词:^Z
你为什么输入个EOF(windows里按ctrl+z,linux里是ctrl+c)给我?
无论是否异常最终都会被执行finally!
2) 场景二输入ctrl+c模拟终止输入
请输入些单词:
你输出了取消键ctr+c
无论是否异常最终都会被执行finally!
3) 场景三正常输入hello xiaodao
请输入些单词:hello xiaodao
你输入了 hello xiaodao
无论是否异常最终都会被执行finally!
11.2.2 tryexcept语句
该异常捕获语句是上述完整语句的简化版。
代码示例:
如下是个键盘接受用户输入的程序
try:
text = input('请输入些单词:')
except:
print('你的输入有误')
else:
print('你输入了 {0}'.format(text))
finally:
print('无论是否异常最终都会被执行finally!')
执行结果:
1) 场景一输入ctrl+z模拟程序终止
请输入些单词:^Z
你的输入有误
无论是否异常最终都会被执行finally!
2) 场景二输入ctrl+c模拟终止输入
请输入些单词:
你的输入有误
无论是否异常最终都会被执行finally!
3) 场景三输入hello world
请输入些单词:hello world
你输入了 hello world
无论是否异常最终都会被执行finally!
如果你想查看异常的详细原因,还可以将异常记录到一个文件里。修改后的代码见下:
改善后代码:
importtraceback
try:
text = input('请输入些单词:')
except:
print('你的输入有误,详细错误信息,请查看c:\\inputerror.txt')
f=open("c:\\inputerror.txt",'a')
traceback.print_exc(file=f)
f.flush()
f.close()
else:
print('你输入了 {0}'.format(text))
finally:
print('无论是否异常最终都会被执行finally!')
执行结果:
请输入些单词:^Z
你的输入有误,详细错误信息,请查看c:\inputerror.txt
无论是否异常最终都会被执行finally!
通过查看c:\inputerror.txt里的内容,我们知道这里是个EOFError。
Traceback (mostrecent call last):
File "FileOperate.py", line 115, in<module>
text = input('请输入些单词:')
EOFError
11.2.3 tryfinally语句
该语句没有对异常进行处理,即无论是否有异常都会正常执行但异常会被python捕获到并终止程序。
try:
text = input('请输入些单词:')
finally:
print('无论是否异常最终都会被执行finally!')
print("程序异常后将不会执行,反之会显示")
执行结果:
1) 场景一输入ctrl+z模拟程序终止
请输入些单词:^Z
无论是否异常最终都会被执行finally!
Traceback (mostrecent call last):
File "FileOperate.py", line 129, in<module>
text = input('请输入些单词:')
EOFError
注:这里出现异常,最后一行的print函数没有再执行。
2) 场景一输入hello world
请输入些单词:hellow world
无论是否异常最终都会被执行finally!
程序异常后将不会执行,反之会显示
注:不建议这样使用try except和try finally方式捕获异常,因为更细分的异常没有个个捕获。
11.3 抛出异常
如果我们知道程序中会有一个很显著的异常时可以使用 raise 语句抛出它。比方0不能做分母。
代码示例:
defdivide(x, y):
if y == 0 :
raise ZeroDivisionError('The zero is notallow')
return x / y
a=input("请输入个数字:")
b=input("请输入另外个数字:")
print("除法结果:\t"+str(divide(int(a),int(b))))
执行结果:
1) 场景一输入0作为分母
请输入个数字:10
请输入另外个数字:0
Traceback (most recent call last):
File"FileOperate.py", line 159, in <module>
print("除法结果:\t"+str(divide(int(a),int(b))))
File"FileOperate.py", line 155, in divide
raiseZeroDivisionError('The zero is not allow')
ZeroDivisionError:The zero is not allow
2) 场景二输入正常的数字
请输入个数字:10
请输入另外个数字:20
除法结果: 0.5
11.4 自定义异常
自定义异常是通过创建一个新的exception类来拥有自己的异常。异常通过需要继承自 Exception 类。
代码示例:
这里定义了一个自己的异常,会记录外部传来的value值。主程序里当输入数字小于10时触发自定义异常。
classMyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
a=input("pleaseinput a num:")
ifint(a)<10:
try:
raise MyError(a)
except MyError as e:
print('我自定义的异常触发了,输入的value小于10,它的值是:', e.value)
else:
print("查询正常执行!")
执行结果:
1) 场景一输入5
please input a num:5
我自定义的异常触发了,输入的value小于10,它的值是: 5
2) 场景二输入15
please input a num:18
查询正常执行!
11.5 系统定义异常
Python预定义了些常用的异常,一般我们叫它系统定义异常。这些异常的详细信息见下表的说明:
异常名称 |
描述 |
BaseException |
所有异常的基类 |
SystemExit |
解释器请求退出 |
KeyboardInterrupt |
用户中断执行(通常是输入^C) |
Exception |
常规错误的基类 |
StopIteration |
迭代器没有更多的值 |
GeneratorExit |
生成器(generator)发生异常来通知退出 |
StandardError |
所有的内建标准异常的基类 |
ArithmeticError |
所有数值计算错误的基类 |
FloatingPointError |
浮点计算错误 |
OverflowError |
数值运算超出最大限制 |
ZeroDivisionError |
除(或取模)零 (所有数据类型) |
AssertionError |
断言语句失败 |
AttributeError |
对象没有这个属性 |
EOFError |
没有内建输入,到达EOF 标记 |
EnvironmentError |
操作系统错误的基类 |
IOError |
输入/输出操作失败 |
OSError |
操作系统错误 |
WindowsError |
系统调用失败 |
ImportError |
导入模块/对象失败 |
LookupError |
无效数据查询的基类 |
IndexError |
序列中没有此索引(index) |
KeyError |
映射中没有这个键 |
MemoryError |
内存溢出错误(对于Python 解释器不是致命的) |
NameError |
未声明/初始化对象 (没有属性) |
UnboundLocalError |
访问未初始化的本地变量 |
ReferenceError |
弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError |
一般的运行时错误 |
NotImplementedError |
尚未实现的方法 |
SyntaxError |
语法错误 |
IndentationError |
缩进错误 |
TabError |
Tab 和空格混用 |
SystemError |
一般的解释器系统错误 |
TypeError |
对类型无效的操作 |
ValueError |
传入无效的参数 |
UnicodeError |
Unicode 相关的错误 |
UnicodeDecodeError |
Unicode 解码时的错误 |
UnicodeEncodeError |
Unicode 编码时错误 |
UnicodeTranslateError |
Unicode 转换时错误 |
Warning |
警告的基类 |
DeprecationWarning |
关于被弃用的特征的警告 |
FutureWarning |
关于构造将来语义会有改变的警告 |
OverflowWarning |
旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning |
关于特性将会被废弃的警告 |
RuntimeWarning |
可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning |
可疑的语法的警告 |
UserWarning |
用户代码生成的警告 |
11.6 总结
这一章我们已经讨论了try..except和try..finally 语句的用法,同时也学习了如何创建我们自己的异常类型以及如何引发异常。接下来,我们将探索Python 标准库。
Python基础概念_10_异常处理相关推荐
- 原python基础概念整理_Python从头学之基础概念整理
学程序真的是一个无法间断的过程,只要你懈怠,种种原因都是你的理由.然而造成的后果就是到目前位置,一个心目中的项目都没有完美的做出来: 归根结底,其实就是基础没有打好,因为每一个复杂的功能都是由很多简单 ...
- Python基础概念_14_常见术语
常见术语 15 常见术语 15.1 简介 Python里有一些常见的专业名词.用语,我们一般统称为术语.为了更方便的学习python我们通过表格的方式列举了常用的术语和单词以及工具. 15.2 常见术 ...
- Python基础概念_8_字符串处理
字符串处理 9 字符串处理 9.1 简介 在前面的章节里我们介绍了常用的数据类型,其中字符串并没有单独拎出来讲,那么接下来我们将重点讲下它.字符串一般是通过引号('或")包裹起来的,因为它有 ...
- Python基础概念_2_基础概念
基础概念 3 基础概念 3.1 数字 计算机最初设计时就是为了做数据运算的,所以针对这个概念应该不会陌生.在Python的世界里数主要有三种类型: 整数.浮点数和复数,详见下例: a) 5 是一个整数 ...
- python核心理念_《三天搞定Python基础概念之第一天》中文版
前言: 首先,非常感谢Jiang老师将其分享出来!本课件非常经典! 经过笔者亲测,竟然确实只要三天,便可管中窥豹洞见Python及主要库的应用.实属难得诚意之作! 其次,只是鉴于Jiang老师提供的原 ...
- learnpythonthehardway中文版_《三天搞定Python基础概念之第一天》中文版
前言: 首先,非常感谢Jiang老师将其分享出来!本课件非常经典! 经过笔者亲测,竟然确实只要三天,便可管中窥豹洞见Python及主要库的应用.实属难得诚意之作! 其次,只是鉴于Jiang老师提供的原 ...
- Python基础概念_5_函数
函数 6 函数 6.1 简介 函数是被定义的完成指定功能的可被反复使用的代码段.比如我们想实现一个功能,想知道当前的时间,格式是:年-月-日 时:分:秒.我们就可以这么写: import time d ...
- 第4章 基础知识进阶 第4.1节 Python基础概念之迭代、可迭代对象、迭代器
第四章 基础知识进阶 第十七节 迭代.可迭代对象.迭代器 一. 引言 本来计划讲完元组和字典后就讲列表解析和字典解析,但要理解列表解析和字典解析,就需要掌握Python的高级的类型迭代器,因此本 ...
- Python基础概念_11_标准库
标准库 12 标准库 12.1 简介 Python 标准库是随Python附带安装的,它包含大量极其有用的模块.熟悉 Python 标准库是十分重要的,因为如果你熟悉这些库中的模块,那么你的大多数问题 ...
最新文章
- 别再盲目学 Python 了!
- matlab 线性拟合相关系数,Matlab自动选择相关性最高波段并拟合曲线
- NLB网路负载均衡管理器详解
- c语言期末作业自己设计个小程序,帮看一个小程序吧,c语言期末考…求求各位大神了...
- boost采取什么驱动电路_当我们只是采取积极的意愿时会发生什么?
- Python入门级2
- HDU - 5493 Queue 2015 ACM/ICPC Asia Regional Hefei Online(线段树)
- 系统出错, 发生系统错误 1067, 进程意外终止. 解决方法
- java怎么把程序写入持久化_如何将DataFrame持久化到Hive表?
- DEVC++中的 “万能头文件” <bits/stdc++.h>
- 用图片替代cursor光标样式
- GPS NMEA协议,0183 定位数据格式 	双模定位:GNXXX GPS+BD 完整版
- 中国注塑机市场十四五规划建议与竞争态势研究报告2022版
- 方剂学(综合练习)题库【1】
- 解决Chrome浏览器无法加载flash插件的问题
- Minimax AI 算法在井字游戏(或 Noughts and Crosses)游戏中的实现
- 最新版-----新浪微博的第三方登录
- Java中synchronization和Lock对比
- 微信小程序-仿朋友圈点赞评论操作面板
- masonry ajax瀑布流,jquery.masonry瀑布流插件的4个使用步骤
热门文章
- OpenCASCADE:使用DRAW绘图
- wxWidgets:wxHTML 概述
- boost::intrusive::value_traits用法的测试程序
- boost::intrusive::auto_unlink_hook用法的测试程序
- boost::core模块实现范围枚举C++11
- VTK:可视化算法之PlateVibration
- VTK:Utilities之FileOutputWindow
- VTK:PolyData之TransformPipeline
- OpenGL 行星asteroids系统的实例
- C++实现插值查找(附完整源码)