異常處理--logging模塊

一. 異常處理 

   1. 異常類型:

    語法錯誤 : 空格 縮進 語法規則函數

        應該在咱們寫代碼的時候就避免
   邏輯錯誤:
       應該在程序當中寫代碼處理
    條件判斷
   異常處理
  2. 常見的報錯類型:

AttributeError   試圖訪問一個對象沒有的樹形,好比foo.x,可是foo沒有屬性x IOError   輸入/輸出異常;基本上是沒法打開文件 ImportError   沒法引入模塊或包;基本上是路徑問題或名稱錯誤 IndentationError   語法錯誤(的子類) ;代碼沒有正確對齊 IndexError   下標索引超出序列邊界,好比當x只有三個元素,卻試圖訪問x[5] KeyError   試圖訪問字典裏不存在的鍵 KeyboardInterrupt   Ctrl+C被按下 NameError   使用一個還未被賦予對象的變量 SyntaxError P  ython代碼非法,代碼不能編譯(我的認爲這是語法錯誤,寫錯了) TypeError   傳入對象類型與要求的不符合 UnboundLocalError   試圖訪問一個還未被設置的局部變量,基本上是因爲另有一個同名的全局變量, 致使你覺得正在訪問它 ValueError   傳入一個調用者不指望的值,即便值的類型是正確的 
 
  
 

   3. 異常處理

    

    程序的過程當中,若是遇到錯誤,異常觸發後且沒被處理的狀況下,程序就在當前異常處終止,後面的代碼不會運行,

    爲了提升用戶體驗提升代碼的容錯性,就要事先處理它讓程序不要由於報錯而結束.

    基本語法一:
      try:       被檢測的代碼塊       except 異常類型:    #捕獲異常       try中一旦檢測到異常,就執行這個位置的邏輯
 
  
 

  指定異常類型只能用來處理指定的異常狀況,若是非指定異常則沒法處理。

    基本語法二:多分支spa

      s1 = 'hello'       try:       int(s1)       except IndexError as e:         print(e)       except KeyError as e:  #能夠有多個except 用來捕獲指定異常       print(e)       except ValueError as e: #多個except        print(e)

    基本語法三:萬能異常線程

      s1 = 'hello'       try:       int(s1)       except Exception as e:       print(e)

    基本語法四:與else,finally連用debug

 
 
s1 = 'hello' try: int(s1) except IndexError as e: print(e) except KeyError as e: print(e) except ValueError as e: print(e) #except Exception as e: # print(e) else:                    #若是能確保else下的代碼不會報錯,能夠將這些代碼寫在try的代碼最後,達到的效果同樣 print('try內代碼塊沒有異常則執行我')      finally: print('不管異常與否,都會執行該模塊,一般是進行清理工做')    
 
 
   finally : 必須執行
  遇到return也會執行finally中的代碼
     遇到exit也會執行finally中的代碼

  遇到報錯也在程序結束以前先執行finally中的代碼

  4. 主動拋異常

  

  try:   raise TypeError('類型錯誤')   except Exception as e:   print(e)

    能夠用在繼承上,若是子類沒有實現父類的方法就報錯調試

 

  5.自定義異常:日誌

  

class SelfException(Exception):    #繼承萬能異常Exception def __init__(self,msg): self.msg=msg super().__init__()        #執行Exception的__init__ def __str__(self): return self.msg # try: # raise SelfException('類型錯誤') # except SelfException as e: # print(e) raise SelfException('類型錯誤') ''' raise SelfException('類型錯誤') __main__.SelfException: 類型錯誤 '''

 

    5. 斷言code

   assert  條件orm

assert 1 == 2 一旦條件不成立後面的代碼就再也不執行 直接報錯 (異常處理能夠攔截) ... ... ... ''' assert 1==2 AssertionError '''

 二  logging模塊

  

import logging logging.basicConfig(level=logging.DEBUG,  format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S',
            # filemode='w',   #以w模式寫入文件 不能同時寫入文件和打印在屏幕上
            # filename='test.log'   #文件名
)
 logging.debug('debug message') # 調試 logging.info('info message') # 普通訊息 logging.warning('warning message') # 警告 logging.error('error message') # 錯誤信息 logging.critical('critical message')# 嚴重錯誤 # 默認狀況下 不打印warning如下級別的信息 # 1.中文顯示亂碼 # 2.不能同時輸出到文件和屏幕

 

 

logging.basicConfig()函數中可經過具體參數來更改logging模塊默認行爲,可用參數有: filename:用指定的文件名建立FiledHandler,這樣日誌會被存儲在指定的文件中。 filemode:文件打開方式,在指定了filename時使用這個參數,默認值爲「a」還可指定爲「w」。 format:指定handler使用的日誌顯示格式。 datefmt:指定日期時間格式。 level:設置rootlogger(後邊會講解具體概念)的日誌級別 stream:用指定的stream建立StreamHandler。能夠指定輸出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默認爲sys.stderr。若同時列出了filename和stream兩個參數,則stream參數會被忽略。 format參數中可能用到的格式化串: %(name)s Logger的名字 %(levelno)s 數字形式的日誌級別 %(levelname)s 文本形式的日誌級別 %(pathname)s 調用日誌輸出函數的模塊的完整路徑名,可能沒有 %(filename)s 調用日誌輸出函數的模塊的文件名 %(module)s 調用日誌輸出函數的模塊名 %(funcName)s 調用日誌輸出函數的函數名 %(lineno)d 調用日誌輸出函數的語句所在的代碼行 %(created)f 當前時間,用UNIX標準的表示時間的浮 點數表示 %(relativeCreated)d 輸出日誌信息時的,自Logger建立以 來的毫秒數 %(asctime)s 字符串形式的當前時間。默認格式是 「2003-07-08 16:49:45,896」。逗號後面的是毫秒 %(thread)d 線程ID。可能沒有 %(threadName)s 線程名。可能沒有 %(process)d 進程ID。可能沒有 %(message)s用戶輸出的消息

 

logger對象 :
  logger對象的方式來使用logging模塊
  首先 先建立logger對象
  第二 建立一個文件操做符
  第三 建立一個屏幕操做符
  第四 建立一個格式

  logger 綁定 文件操做符
  logger 綁定 屏幕操做符
  文件操做符 綁定格式
  屏幕操做符 綁定格式
 
 
 
import logging # 用logger # 首先 先建立logger對象 logger = logging.getLogger() logger.setLevel(logging.DEBUG) # 第二 建立一個文件操做符 fh = logging.FileHandler('log',encoding='utf-8') # 第三 建立一個屏幕操做符 sh = logging.StreamHandler() # 第四 建立一個格式 fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # logger 綁定 文件操做符 logger.addHandler(fh) # logger 綁定 屏幕操做符 logger.addHandler(sh) # 文件操做符 綁定格式 fh.setFormatter(fmt) # 屏幕操做符 綁定格式 sh.setFormatter(fmt) logger.debug('logger debug message') logger.info('logger info message') logger.warning('logger warning message') logger.error('logger error message') logger.critical('logger critical message')
相關文章
相關標籤/搜索