概述在编程中,经常需要处理出现的错误,比如说编程中出现的异常,网络超时等等,有的错误是可以估计到的,比如说 0 / 1 肯定是错误的除法,一些是估计不到的。 但是不能因为有错误,整个程序就停止了,程序的鲁棒性就体现在面对错误,能够处理错误错误处理语句try: passexcept 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): passclass InputError(Error): def init(self,message): self.message = message def str(self): return self.messagedef 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知道了异常和如何处理异常,在调试的过程中是十分方便的,但是如果程序已经上线了,那个时候出了问题,要调查就需要借助于log 这个东西了。一般来说,会在程序中创建一个logger 类,用来专门的 log 处理。 可以定义好一个适合自己的 logger 类,需要的时候,直接拿来用即可.# coding:utf-8import logging,osimport logging.handlersimport ctypes# 渲染FOREGROUND_WHITE = 0x0007FOREGROUND_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# cmdSTD_OUTPUT_HANDLE= -11std_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 boolclass 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信息’)
5-错误处理
January 8, 2019 · 1 min · jiezi