一. python中异常捕捉
python中捕捉异常模块try/except,其中python中有一些自定义的异常,具体如下
AttributeError 调用不存在的方法引发的异常
EOFError 遇到文件末尾引发的异常
ImportError 导入模块出错引发的异常
IndexError 列表月越界引发的异常
IOError I/O操作引发的异常,如打开文件出错等
KeyError 使用字典中不存在的关键字引发的异常
NameError 使用不存在的变量名引发的异常
TabError 语句块缩进不正确引发的异常
ValueError 搜索列表中不存在值引发的异常
ZeroDivisionError 除数为零引发的异常
1.1 捕捉异常并抛出
先通过一段代码看下python中异常的捕获,这里为了能清楚看到异常,使用traceback模块对异常进行了追踪
import sys
import traceback
class DefineError:
def __init__(self):
pass
@staticmethod
def fun_error():
try:
c = 1 / 0
except Exception as e:
info = sys.exc_info()
# traceback.print_tb(info[2])
traceback.print_exc()
print(e, "here is error")
if __name__ == '__main__':
obj = DefineError()
obj.fun_error()
输出结果
Traceback (most recent call last):
File "D:/work/code/auto_test/define_error.py", line 50, in fun_error
c = 1 / 0
ZeroDivisionError: division by zero
division by zero here is error
我们可以看到出现了division by zero的错误
1.2 异常追踪和异常输出
上面我们可以看到traceback追踪到异常,接下来介绍异常的处理
class DefineError:
def __init__(self):
pass
@staticmethod
def fun_error():
try:
c = 1 / 0
except Exception as e:
info = sys.exc_info()
traceback.print_tb(info[2])
# traceback.print_exc()
print(info, "****************")
if __name__ == '__main__':
obj = DefineError()
obj.fun_error()
输出结果:
(<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero',), <traceback object at 0x00000277D8D5C948>) ****************
File "D:/work/code/auto_test/define_error.py", line 50, in fun_error
c = 1 / 0
使用sys.exc_info()对异常进行追踪后可以看到输出一个包含3个元素的元组,第一个元素是一个 ZeroDivisionError 类;第 2 个元素是异常类型 ZeroDivisionError 类的一个实例;第 3 个元素为一个 traceback 对象。其中,通过前 2 个元素可以看出抛出的异常类型以及描述信息,对于第 3 个元素,是一个 traceback 对象,无法直接看出有关异常的信息,还需要对其做进一步处理
try:
func()
except:
# 捕捉异常,并将异常传播信息输出控制台
traceback.print_exc()
# 捕捉异常,并将异常传播信息输出指定文件中
traceback.print_exc(file=open('log.txt', 'a'))
其中使用traceback.print_exc追踪到的异常可以写入文件中
1.3 多异常捕获
try:
print(1 / 0)
except(ZeroDivisionError, TypeError, NameError): # NameError找不到名字(变量)时引发
print('Your numbers were bogus....')
我们可以再一个异常捕获里面同时放多个异常捕获条件,实现多异常捕获
1.4 异常略过
class DefineError:
def __init__(self):
pass
@staticmethod
def fun_error():
try:
c = 1 / 0
except:
# traceback.print_exc()
print("****************")
if __name__ == '__main__':
obj = DefineError()
obj.fun_error()
捕捉所有的异常,except后不指定任何异常类即可。但是这样使用会隐藏没考虑过的错误不推荐。更好的选择是使用except Except as e并对异常对象进行检查。这样也会使得不是从Except类派生而来的异常漏掉。像SystemExit和KeyboradInterrupt都是从BaseExcept(Except的超类)派生而来的
1.5 try结合raise自定义异常
# 先自定义一个异常抛出模块
class MyDefineError(Exception):
def __init__(self, name, reason):
self.name = name
self.reason = reason
class Test:
def __init__(self):
pass
@staticmethod
def work(p):
print("执行work函数")
try:
if p < 5:
raise MyDefineError('自定义错误', "参数小于既定值")
except MyDefineError as e:
print("here is error info, name is %s: reason is %s" % (e.name, e.reason))
if __name__ == '__main__':
t = Test()
t.work(4)
输出结果:
执行work函数
here is error info, name is 自定义错误: reason is 参数小于既定值
注意点:
自定义异常模块可以捕捉到自己模块定义的一些异常信息,但是系统内置的异常信息无法捕获到