Python基础概念_10_异常处理
2017-06-16 09:30
609 查看
异常处理
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基础教程共60课-第36课异常处理
- python基础----异常处理
- Python基础知识(三)--基本的异常处理、算术运算符、输入/输出
- python基础知识三——try与except处理异常语句
- python基础之try异常处理、socket套接字基础part1
- python基础教程_学习笔记10:异常
- Py修行路 python基础 (二十二)异常处理
- Python基础语法(3)——文件流、异常处理、面向对象编程以及装饰器
- node基础10:处理异常
- Python异常处理方面的一些基础知识。
- Python基础知识(三)--基本的异常处理、算术运算符、输入/输出
- Object-C基础(10)——异常处理、反射、动态调用方法与内存回收
- 我与python约个会:28. 企业级开发基础9:异常处理
- python基础之异常处理
- .Net程序员之Python基础教程学习----函数和异常处理[Fifth Day]
- python基础之异常处理
- Python中的异常处理相关语句基础学习笔记
- 【脚本语言系列】关于Python基础知识异常处理,你需要知道的事
- Python基础概念_8_字符串处理