python通过sys.exc_info获取异常信息,通过traceback.print_exc打印堆栈信息,包括错误类型和错误位置等信息。
所有错误都是异常,但并非所有异常都是错误。比如,有些异常表示警告(参考warnings模块),有些异常是功能信号(比如,input函数从标准输入流sys.stdin读取输入)。
用法
while True:
try:
ins=input('请输入:')
except EOFError as e:
# except 代码块
break
else:
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 触发 EOFError
print('遇到 Ctrl+D 或 Ctrl+Z,退出输入')
print(traceback.print_exc())
break
else:
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
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'
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>)
用法
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'