Python基础概念_10_异常处理
来源:互联网 发布:it技能有哪些 编辑:程序博客网 时间:2024/06/05 09:50
异常处理
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异常处理基础笔记
- python异常处理(基础)
- Python 爬虫基础 异常处理
- python基础之异常处理
- python基础之异常处理
- python基础03--异常处理
- java基础_10_泛型
- Python基础概念_8_字符串处理
- Python基础(九)- 异常处理
- OC学习_10_异常_包装类
- 结构化异常处理概念
- java异常概念及其处理
- Python基础学习篇—异常处理机制
- python基础之异常处理、调试和正则表达式
- Python 基础 ——异常与错误处理
- 不要轻易和少妇上床:金融危机是这…
- [投资习惯对比]投资大师vs失败投资…
- 全自动洗衣机维修教程
- 通过screen工具实现终端模拟软件(例如Xshell)远程连接服务器断线后的会话(界面)恢复方法
- C++ primer
- Python基础概念_10_异常处理
- jQuery 控制div框自动缩小字体避免换行
- Git 学习
- C#——文件分割与合并2
- 就Java Web开发中文乱码问题讨论
- javascript扫雷, canvas界面
- Android Studio的设置
- 每个程序员都需要知道一些游戏网络知识
- python3一些工具的安装