5-错误处理

21次阅读

共计 2358 个字符,预计需要花费 6 分钟才能阅读完成。

概述
在编程中,经常需要处理出现的错误,比如说编程中出现的异常,网络超时等等,有的错误是可以估计到的,比如说 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 信息 ’)

正文完
 0