在編程中,常常須要處理出現的錯誤,好比說編程中出現的異常,網絡超時等等,有的錯誤是能夠估計到的,好比說 0 / 1 確定是錯誤的除法,一些是估計不到的。 可是不能由於有錯誤,整個程序就中止了,程序的魯棒性就體如今面對錯誤,可以處理錯誤python
try: pass except Exception as e: print(e)
上面的程序會把致使程序出錯的緣由,一句話描述出來,這樣有時候難免顯得不夠清晰,咱們可使用下面的代碼,顯示出錯的堆棧編程
try: s = 0 / 1 except Exception as e: print(traceback.from_exec())
python的全部內建的異常,所有繼承於BaseException 這個類,官方文檔看到,自建異常對象推薦是建立一個Error 類, Error 類繼承 Exception 類,而後具體的異常對象在繼承這個Error 類網絡
class Error(Exception): pass class InputError(Error): def __init__(self,message): self.message = message def __str__(self): return self.message def test_exception(): i = 1 if i == 1: raise InputError("the number can't equal to 1") try: test_exception() except InputError as e: print(e)
知道了異常和如何處理異常,在調試的過程當中是十分方便的,可是若是程序已經上線了,那個時候出了問題,要調查就須要藉助於log 這個東西了。
通常來講,會在程序中建立一個logger 類,用來專門的 log 處理。 能夠定義好一個適合本身的 logger 類,須要的時候,直接拿來用便可.命令行
# coding:utf-8 import logging,os import logging.handlers import ctypes # 渲染 FOREGROUND_WHITE = 0x0007 FOREGROUND_BLUE = 0x01 # text color contains blue. FOREGROUND_GREEN= 0x02 # text color contains green. FOREGROUND_RED = 0x04 # text color contains red. FOREGROUND_YELLOW = FOREGROUND_RED | FOREGROUND_GREEN # cmd STD_OUTPUT_HANDLE= -11 std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) def set_color(color, handle=std_out_handle): bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color) return bool class Logger(object): def __init__(self,name,path,clevel=logging.DEBUG,flevel=logging.DEBUG): self.logger = logging.getLogger(name) # 這個必須設置,不然默認不顯示debug或者info的信息,也就是說這個的配置會覆蓋掉cmd和file的配置 self.logger.setLevel(logging.DEBUG) # 設置格式化 _fmt = logging.Formatter('[%(asctime)s] [%(levelname)s] %(name)s : %(message)s', '%Y-%m-%d %H:%M:%S') # 設置命令行 sh = logging.StreamHandler() sh.setFormatter(_fmt) sh.setLevel(clevel) # 設置文件log fh = logging.handlers.RotatingFileHandler( path, maxBytes=10240000, backupCount=5, encoding='utf-8' ) fh.setFormatter(_fmt) fh.setLevel(flevel) # 添加處理器 self.logger.addHandler(sh) self.logger.addHandler(fh) def debug(self,msg): self.logger.debug(msg) def info(self,msg): self.logger.info(msg) def warn(self,msg,color=FOREGROUND_YELLOW): set_color(color) self.logger.warn(msg) set_color(FOREGROUND_WHITE) def error(self,msg,color=FOREGROUND_RED): set_color(color) self.logger.error(msg) set_color(FOREGROUND_WHITE) def critlal(self,msg): self.logger.critical(msg) if __name__ =='__main__': logyyx = Logger(__name__,'logs/test2.log',) logyyx.debug('一個debug信息') logyyx.info('一個info信息') logyyx.warn('一個warning信息') logyyx.error('一個error信息') logyyx.critlal('一個致命critical信息')