5-错误处理

概述

在编程中,常常须要处理出现的错误,好比说编程中出现的异常,网络超时等等,有的错误是能够估计到的,好比说 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

知道了异常和如何处理异常,在调试的过程当中是十分方便的,可是若是程序已经上线了,那个时候出了问题,要调查就须要借助于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信息')
相关文章
相关标签/搜索