Flask異常處理使用記錄

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()是上面自定義的異常

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容