美文网首页Python
5-错误处理

5-错误处理

作者: 神秘加冰 | 来源:发表于2019-01-15 17:02 被阅读0次

    概述

    在编程中,经常需要处理出现的错误,比如说编程中出现的异常,网络超时等等,有的错误是可以估计到的,比如说 0 / 1 肯定是错误的除法,一些是估计不到的。 但是不能因为有错误,整个程序就停止了,程序的鲁棒性就体现在面对错误,能够处理错误

    错误处理语句

    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

    知道了异常和如何处理异常,在调试的过程中是十分方便的,但是如果程序已经上线了,那个时候出了问题,要调查就需要借助于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信息')
    

    相关文章

      网友评论

        本文标题:5-错误处理

        本文链接:https://www.haomeiwen.com/subject/zyiydqtx.html