Python3中异常处理常用的三种方法

一般我们我们想捕获python的异常写入到log,做处理的话,一般用try语句来做处理,大概语法如下:
try:
    语句1
    语句2
    .
    .
    语句N
except ........ :
    do something .......
但是你并不知道"语句1至语句N"哪个会出现什么样的错误,但你还要做异常处理,且想把出现的异常打印出来,并不停止程序的运行,所以在"except ......"语句就起作用了。   方法一:捕获所有异常
Python2如下:
try:  
    语句1  
    语句2
    .....
    语句N
except Exception,e:  
    print Exception,":",e

Python3如下:
try:
    语句1
    语句2
    .....
    语句N
except Exception as e:
    print(Exception, ":", e)
例子如下:
try:
    a = 1
    b = a
    c = w
except Exception as e:
    print(Exception, ":", e)
    
结果为:
 : name 'w' is not defined
 方法二:采用sys模块回溯最后的异常 sys.exc_info() 会返回一个3值元表,其中包含调用该命令时捕获的异常。 这个元表的内容为 (type, value, traceback) ,其中:
  • type 从获取到的异常中得到类型名称,它是BaseException 的子类;
  • value 是捕获到的异常实例;
  • traceback 是一个 traceback 对象,下面会详述。
import systry:    w = abs(-1)    list.append(w)except:    info = sys.exc_info()    print(info[0], ":", info[1])    # 结果如下: : descriptor 'append' requires a 'list' object but received a 'int'
sys.last_traceback 包含的内容与 sys.exc_info() 相同,但它主要用于调试,并不总是被定义。 三、采用traceback模块查看异常trackback 模块用来精确模仿 python3 解析器的 stack trace 行为。在程序中应该尽量使用这个模块。traceback.print_exc() 可以直接打印当前的异常。
import tracebacktry:    raiseexcept:    traceback.print_exc()
traceback.print_tb() 用来打印上面提到的 trackback 对象。
import sys,tracebacktry:    raiseexcept:    t,v,tb = sys.exc_info()    traceback.print_tb(tb)
traceback.print_exception() 可以直接打印 sys.exc_info()提供的元表。
import sys,tracebacktry:    raiseexcept:    traceback.print_exception(*sys.exc_info())
其实,下面两句是等价的:
  • traceback.print_exc()
  • traceback.print_exception(*sys.exc_info())
  traceback 提供的参数可以将 print 的内容写入到文件中
import traceback
try:  
    a=b  
    b=c  
except:  
    f=open("log.txt",'a')  
    traceback.print_exc(file=f)  
    f.flush()  
    f.close()
参考: https://docs.python.org/3/library/traceback.html?highlight=print_tb#traceback.print_exc https://docs.python.org/3/tutorial/errors.html

0 个评论

要回复文章请先登录注册