1 python获取异常信息exc_info和print_exc
python通过sys.exc_info获取异常信息,通过traceback.print_exc打印堆栈信息,包括错误类型和错误位置等信息。
1.1 异常不一定是错误
所有错误都是异常,但并非所有异常都是错误。比如,有些异常表示警告(参考warnings模块),有些异常是功能信号(比如,input函数从标准输入流sys.stdin读取输入)。
用法
while True:try:ins=input('请输入:')except EOFError as e:# except 代码块breakelse:print('你输入的是:',ins)
描述
(1) 通过input循环获取用户输入;
(2) 通过EOFError 作为功能信号,触发则退出输入;
(3) 通过Ctrl+D(windows)或Ctrl+Z(Unix)触发EOFError 异常;
示例
>>> import traceback
>>> while True:try:ins=input('请输入:')except EOFError as e:# 通过 Ctrl+D 或 Ctrl+Z 触发 EOFErrorprint('遇到 Ctrl+D 或 Ctrl+Z,退出输入')print(traceback.print_exc())breakelse:print('你输入的是:',ins)请输入:梯阅线条
你输入的是: 梯阅线条
请输入:
遇到 Ctrl+D 或 Ctrl+Z,退出输入
Traceback (most recent call last):File "<pyshell#58>", line 3, in <module>
EOFError: EOF when reading a line
None
1.2 异常条件语句和raise
python自定义异常也可用于触发非错误的情况,根据条件语句触发raise异常。
用法
class FoundByExc(Exception):pass
def search_by_exc(strlist,target):if True:raise FoundByExc("xxx")else:return "xxx"
描述
搜索指定内容时触发异常。
(1) 自定义一个异常类;
(2) 条件成立,触发异常;
示例
>>> class FoundByExc(Exception):pass>>> def search_by_exc(strlist,target):for s in strlist:if s == target:raise FoundByExc("在{}找到'{}'".format(strlist,target))else:return "在{}未找到'{}'".format(strlist,target)>>> def test_searchbyexc(strlist,target):try:sbe=search_by_exc(strlist,target)except FoundByExc as fbe:print(fbe)else:print(sbe)>>> strlist=['梯阅线条','tyxt.work','9555']
>>> target1='梯阅线条';target2='tyxt'
>>> test_searchbyexc(strlist,target1)
在['梯阅线条', 'tyxt.work', '9555']找到'梯阅线条'
>>> test_searchbyexc(strlist,target2)
在['梯阅线条', 'tyxt.work', '9555']未找到'tyxt'
1.3 sys.exc_info获取异常信息
python中空的except捕获任何未被捕获的异常,通过sys.exc_info获取捕获的实际异常。
用法
import sys
sys.exc_info()
描述
返回元组(type,value,traceback),
type:捕获的异常类型;
value:捕获的异常类的实例;
traceback:触发异常的调用堆栈;
示例
>>> try:1+[]
except:print(sys.exc_info())(<class 'TypeError'>, TypeError("unsupported operand type(s) for +: 'int' and 'list'"), <traceback object at 0x03EFEE40>)
1.4 traceback.print_exc打印异常堆栈
用法
import traceback
try:# try 代码块
except xxx:# except 代码块traceback.print_exc()
描述
当Python程序发生异常时,通过traceback.print_exc()获取异常的详细信息,包括异常类型、异常值和异常发生的位置信息。
(1) 导入 traceback模块;
(2) 在except处理器,调用traceback.print_exc()方法;
示例
>>> import traceback
>>> try:1+[]
except:traceback.print_exc()Traceback (most recent call last):File "<pyshell#79>", line 2, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'list'