python异常处理
学习完本篇,你将会独立完成
- 如何编写一个程序防止异常崩溃退出
- 各种异常如何捕获
- 为后面接口自动化以及web自动化做准备
什么是异常
- 在程序运行过程中可能发生的不正常事件。
- 会中断正在运行中的程序。
- 异常是程序执行期间发生的各种意外或错误。比如说:
① 用户输入出错
② 所需文件找不到
③ 运行时磁盘空间不够
④ 内存不够
⑤ 算术运算错 (数的溢出,被零除…)
⑥ 数组下标越界
以及其它情况
Python中常见的异常类型
>>> v
NameError: name 'v' is not defined
>>> v = 1/0ZeroDivisionError: int division or modulo by zero
>>> int intSyntaxError: invalid syntax (<pyshell#14>, line 1)
>>> List = [2]>>> List[3]Traceback (most recent call last): File "<pyshell#18>", line 1, in <module> List[3]IndexError: list index out of range
>>> Dic = {'1':'yes', '2':'no'}>>> Dic['3']Traceback (most recent call last): File "<pyshell#20>", line 1, in <module> Dic['3']KeyError: '3‘
>>> f = open('abc')IOError: [Errno 2] No such file or directory: 'abc'
>>> class Worker: def Work(): print("I am working")
>>> w = Worker()>>> w.aTraceback (most recent call last): File "<pyshell#51>", line 1, in <module> w.aAttributeError: 'Worker' object has no attribute 'a‘
>>> int('d')Traceback (most recent call last): File "<pyshell#54>", line 1, in <module> int('d')ValueError: invalid literal for int() with base 10: 'd‘
>>> iStr = '22'>>> iVal = 22>>> obj = iStr + iVal;Traceback (most recent call last): File "<pyshell#68>", line 1, in <module> obj = iStr + iVal;TypeError: Can't convert 'int' object to str implicitly
>>> assert 1 != 1Traceback (most recent call last): File "<pyshell#70>", line 1, in <module> assert 1 != 1AssertionError
异常类的层次结构
- 所有的python异常类都是系统类库中的BaseException类的子类,再由SystemExit、KeyboardInterrupt、GeneratorExit和Exception演变而来。大多数类有Exception演变而来,具体结构如下:
Python异常层次图
异常名称 |
描述 |
BaseException |
所有异常的基类 |
SystemExit |
解释器请求退出 |
KeyboardInterrupt |
用户中断执行(通常是输入^C) |
GeneratorExit |
生成器(generator)发生异常来通知退出 |
Exception |
常规错误的基类 |
StopIteration |
迭代器没有更多的值 |
StandardError |
所有的内建标准异常的基类 |
Warning |
警告的基类 |
异常处理
- try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
如果你不想在异常发生时结束你的程序,只需在try里捕获它。
- 语法:
try
<语法> #运行别的代码
except <名字>:
<语句> #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句> #如果引发了'name'异常,获得附加的数据
else:
<语句> #如果没有异常发生
- try工作原理
当开始一个try语句,python就在当前程序的上下文中做标记,这样当异常出现时就可以回到这里,try字句先执行,接下来会发生什么依赖于于执行时是否出现异常。
1.如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except字句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
2.如果在try后的语句里发生了异常,却没有匹配的except字句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
3.如果try字句执行时没有发生异常,python将执行else语句后面的语句(如果此时有else语句),然后控制通过整个try语句
try、except带参数示例
- demo描述:打开一个文件,在该文件中的内容写入内容,且并未发生异常:
#!/usr/bin/python #
-*- coding: UTF-8 -*-
try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print "Error: 没有找到文件或读取文件失败"
else:
print "内容写入文件成功" fh.close()
#!/usr/bin/python #
-*- coding: UTF-8 -*-
try:
fh = open("testfile", “r")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print "Error: 没有找到文件或读取文件失败"
else:
print "内容写入文件成功" fh.close()
异常多种形态
Except不带参数语法:
try:
正常的操作
......................
except:
发生异常,执行这块代码
......................
else:
如果没有异常执行这块代码
Except带多种异常语法:
try:
正常的操作
.....................
except(Exception1 [,...ExceptionN]]]):
#发生以上多个异常中的一个,
#执行这块代码
......................
else:
如果没有异常执行这块代码
try-finally 语句
语法:
try:
<语句>
finally:
<语句> #退出try时总会执行 raise
try-finally实例
# -*- coding: UTF-8 -*-
try:
fh = open("testfile", “r")
fh.write("这是一个测试文件,用于测试异常!!")
finally:
print "Error: 没有找到文件或读取文件失败"
执行顺序:先执行try语句,最后执行finally语句。
# -*- coding: UTF-8 -*-
try:
fh = open("testfile", “r")
try:
fh.write("这是一个测试文件,用于测试异常!!")
finally:
print "关闭文件" fh.close()
except IOError:
print "Error: 没有找到文件或读取文件失败"
思考:try嵌套,思考执行顺序
异常的参数
- 异常参数:一个异常可以可以带上参数,可作为输出的信息参数
语法:try:
正常的操作
…………………
except ExceptionType, Argument:
你可以在这输出 Argument 的值...
# -*- coding: UTF-8 -*-
# 定义函数
def temp_convert(var):
try:
return int(var)
except ValueError, Argument:
print "参数没有包含数字
", Argument
If __name__ == “__main__”
# 调用函数
temp_convert("xyz");
打印结果:
参数没有包含数字
invalid literal for int() with base 10: 'xyz'
触发异常
- raise语法: raise [Exception [, args [, traceback]]]
- 说明:语句中Exception是异常的类型(例如,NameError)参数是一个异常参数值。该参数是可选的,如果不提供,异常的参数是"None"。
最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 定义函数
def mye( level ):
if level < 1:
raise Exception("Invalid level!", level)
# 触发异常后,后面的代码就不会再执行
try:
mye(0)
// 触发异常
except Exception:
print 1 else: print 2