Flask異常處理使用記錄
初識Flask異常處理,是使用
@app.teardown_request鉤子函數(shù)錯處理
# 遇到錯誤就執(zhí)行
@app.teardown_request
def teardown_request(e):
print('error:', e)
我想搭配日志記錄和錯誤狀態(tài)返回
感謝該博主的文章 厲害厲害
我再改吧改吧,哈哈
異常自定義
import json
from flask import request
from werkzeug.exceptions import HTTPException
class APIException(HTTPException):
code = None
msg = None
def __init__(self, msg=None):
self.msg = msg or self.__class__.__name__
super(APIException, self).__init__(msg, None)
def get_body(self, environ=None):
body = dict(
error_msg=self.msg,
error_code=self.code,
request=request.method + ' ' + self.get_url_no_param()
)
return json.dumps(body)
def get_headers(self, environ=None):
"""Get a list of headers."""
return [('Content-Type', 'application/json')]
@staticmethod
def get_url_no_param():
full_path = str(request.full_path)
main_path = full_path.split('?')
return main_path[0]
# 使用type原類封裝一個類的工廠
def gen_error(name: str, err_code: int) -> APIException:
base_cls = (APIException,)
cls_attr = {'code': err_code}
return type(name, base_cls, cls_attr)
# 通用錯誤,自定義,狀態(tài)碼和描述
NotFoundError = gen_error('NotFoundError', 404)
InternalError = gen_error('InternalError', 500) # 服務(wù)器內(nèi)部錯誤
ParamsError = gen_error('ParamsError', 1001) # 參數(shù)錯誤
DataError = gen_error('DataError', 1002) # 數(shù)據(jù)錯誤
DoseNotExist = gen_error('DoseNotExist', 1003) # 不存在
ReachUpperLimit = gen_error('ReachUpperLimit', 1004) # 達(dá)到上限
PermissionDenied = gen_error('PermissionDenied', 1005) # 沒有權(quán)限
Timeout = gen_error('Timeout', 1006) # 超時
Expired = gen_error('Expired', 1007) # 已過期
NotAllowRequestType = gen_error('NotAllowRequestType', 1008) # 不允許的請求方式
RestrictOperation = gen_error('RestrictOperation', 1009) # 限制操作
UnKnownError = gen_error('UnKnownError', 1020) # 未知錯誤
Flask全局處理
# 全局錯誤AOP處理
@app.errorhandler(Exception)
def framework_error(e):
my_error_log.logger.error(e) # 對錯誤進(jìn)行日志記錄,文件/控制臺 輸出
if isinstance(e, APIException):
return e
if isinstance(e, HTTPException):
return UnKnownError()
# return UnKnownError('要提示的信息,為空的話,默認(rèn)提示創(chuàng)建時的類名哦')
else:
return InternalError()
UnKnownError()和InternalError()是上面自定義的異常