【Python】【异常的获取与处理】
一、traceback模块(import traceback)
1. traceback.print_exc() # 直接打印出来
traceback.print_exc(file=open("test.txt","a+") # 若没有test.txt文件,则新建一个,写入调试信息,若存在,则在后面追加
2.traceback.print_expection() #返回字符串
3.traceback.format_expection(type,value,tb[,limit]) # 格式化栈信息和异常信息,返回一个列表,包括代码文件和代码行,以及异常信息。
4.traceback.extract_tb(traceback,[,limit]) # 返回一个跟踪对象traceback的元祖列表,元组内容为(filename.line number, function name, text)。
二、sys模块
sys.exc_info() ,返回值是一个三元组(type,value/message,traceback),其中type表示异常的类型,value/message表示异常的信息或者参数,而traceback则包含调用栈信息的对象。sys.exc_info()可以直接定位最终引发异常的原因,结果比较简洁,但是缺点是难以直接确定引发异常的代码位置。
具体实践例子
import sys def divnum(a,b): c=a/b return c try: print(divnum(2,0)) except: print(sys.exc_info()) ##1,
print(traceback.print_exc()) ##2
print(traceback.print_exception()) ##3,返回字符串
traceback.print_exc(file=open("test.txt","a+") ##4 若没有test.txt文件,则新建一个,写入调试信息,若存在,则在后面追加
exc_type,exc_value,exc_traceback=sys.exc_info
print(traceback.format_exception(exc_type,exc_value,exc_traceback)) ## 5
print(traceback.extract_tb(exc_traceback)) ## 6
#1
(<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero'), <traceback object at 0x0000000003928188>)
#2
#3
#5
['Traceback (most recent call last):\n', ' File "D:/WorkSpace/untitled/1.py", line 20, in <module>\n print(divnum(2,0))\n', ' File "D:/WorkSpace/untitled/1.py", line 17, in divnum\n c=a/b\n', 'ZeroDivisionError: division by zero\n']
#6
[<FrameSummary file D:/WorkSpace/untitled/1.py, line 20 in <module>>, <FrameSummary file D:/WorkSpace/untitled/1.py, line 17 in divnum>]