1. 程式人生 > 程式設計 >使用Python將Exception異常錯誤堆疊資訊寫入日誌檔案

使用Python將Exception異常錯誤堆疊資訊寫入日誌檔案

假設需要把發生異常錯誤的資訊寫入到log.txt日誌檔案中去:

import traceback
import logging
 
logging.basicConfig(filename='log.txt',level=logging.DEBUG,format='%(asctime)s - %(levelname)s - %(message)s')
 
try:
 raise Exception('發生異常錯誤資訊')
except:
 #方案一,自己定義一個檔案,自己把錯誤堆疊資訊寫入檔案。
 #errorFile = open('log.txt','a')
 #errorFile.write(traceback.format_exc())
 #errorFile.close()
 
 #方案二,使用Python標準日誌管理維護工具。
 logging.debug(traceback.format_exc())

補充知識:Python---異常處理、呼叫棧、異常記錄、丟擲錯誤

異常處理:

在python中,內建了一套錯誤處理機制:try:...except:...finally

語法:

try:
可能出現異常語句
except 錯誤型別1 as e:
異常處理
except 錯誤型別2 as e:
異常處理2
...
finally:
無論是否出錯,都會執行的語句

PS:python的錯誤也是類,所有錯誤的類都繼承自BaseException。

所以使用except時需注意,不但會捕獲該型別的錯誤,還會將其子類錯誤一網打盡

呼叫棧:

若異常沒有被捕獲,則會一直往上拋,最後拋給直譯器,直譯器列印錯誤的堆疊資訊,然後退出。

因此,查詢錯誤的時候:

1、先看錯誤型別

2、從下往上找

如:

使用Python將Exception異常錯誤堆疊資訊寫入日誌檔案

異常記錄:

如果只使用異常捕獲,結果只會列印錯誤型別,不會列印錯誤堆疊資訊。如果不使用異常捕獲,python直譯器會列印錯誤型別及錯誤堆疊資訊,但是程式也被結束了。使用異常記錄就可以把錯誤型別和錯誤堆疊資訊都打印出來,而且程式可以繼續執行。

import logging

def foo(s):
 return 10/int(s)
def bar(s)
 return foo(s)*2

def mian():
 try:
  bar('0')
 except Exception as e:
  logging.exception(e)
main()
print("END") 

丟擲錯誤:

因為錯誤是class,捕獲一個錯誤就是捕獲到該class的一個例項,因此,錯誤並不是憑空產生的,而是有意建立並丟擲的,pyhton的內建函式會丟擲很多型別的錯誤,我們自己編寫的函式也可以丟擲錯誤。

如果要丟擲錯誤,首先根據需要,可以定義一個錯誤的class,選擇好繼承關係,然後,用raise語句丟擲一個錯誤的例項。

class FooError(valueError):
 pass
def foo(s):
 n = int(s)
 if n == 0:
  raise FooError("invalid value :%s"%s)
 return 10/n
foo('0')

PS:只有在必要的時候才定義我們自己的錯誤型別,如果可以選擇python已有的內建的錯誤型別,儘量使用python內建的錯誤型別。

常見的錯誤型別

- AttributeError 試圖訪問一個物件沒有的屬性
- IOError 輸入/輸出異常 無法開啟檔案
- IndentationError 語法錯誤,程式碼沒有對齊
- keyError 訪問的key字典中不存在
- NameError 使用一個還未賦值的物件的變數
- TypeError 傳入物件型別與要求不合法
- ValueError 傳入一個呼叫者不期望的值

以上這篇使用Python將Exception異常錯誤堆疊資訊寫入日誌檔案就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。