一. 異常處理
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')