背景
在日常開發(fā)過程中产徊,迭代到后期發(fā)現(xiàn)有時(shí)候會(huì)拋出各種亂七八糟的異嘲豪眨或者直接500且沒有任何異常信息,這種情況一般都是某個(gè)代碼塊沒有用try來進(jìn)行異常捕獲舟铜;又或者是api的地址編寫有誤戈盈,直接拋出404了,這類提示都很不友好,故結(jié)合網(wǎng)上的教材塘娶,進(jìn)行了針對(duì)異常的統(tǒng)一捕獲并自動(dòng)以了異常信息归斤,用于接口回顯,這樣相對(duì)來說刁岸,對(duì)于使用者友好一些脏里。
errorhandler
errorhandler捕捉當(dāng)前app或藍(lán)圖的狀態(tài)碼,并進(jìn)行自定制處理
下面是一份示例代碼虹曙,admin是一個(gè)藍(lán)本或者app迫横,發(fā)生404錯(cuò)誤或500錯(cuò)誤,會(huì)返回一個(gè)Json對(duì)象給請(qǐng)求段酝碳。
from flask import jsonify
from . import admin
@admin.errorhandler(404)
def error_404(error):
"""這個(gè)handler可以catch住所有abort(404)以及找不到對(duì)應(yīng)router的處理請(qǐng)求"""
response = dict(status=0, message="404 Not Found")
return jsonify(response), 404
@admin.errorhandler(Exception)
def error_500(error):
"""這個(gè)handler可以catch住所有的abort(500)和raise exeception."""
response = dict(status=0, message="500 Error")
return jsonify(response), 400
class MyError(Exception):
"""自定義錯(cuò)誤類"""
pass
@admin.errorhandler(MyError)
def MyErrorHandle(error):
response = dict(status=0, message="400 Error")
return jsonify(response), 400
app_errorhandler
app_errorhandler捕捉全局狀態(tài)碼矾踱,并進(jìn)行自定制異常處理
在藍(lán)本中編寫錯(cuò)誤處理程序有點(diǎn)不同,如果使用errorhandler修飾器疏哗,那么只有藍(lán)本中的錯(cuò)誤才會(huì)觸發(fā)呛讲。如果想注冊(cè)全局的錯(cuò)誤處理程序,要用app_errorhandler
from . import auth
@auth.app_errorhandler(404)
def error_404(error):
response = dict(status=0, message="404 Not Found")
return jsonify(response), 404
應(yīng)用
以下代碼為自己項(xiàng)目中的實(shí)現(xiàn):
首先新建一個(gè)error.py文件
import json
from flask import Blueprint, Response
exception = Blueprint('exception',__name__)
@exception.app_errorhandler(404)
def error_404(error):
"""這個(gè)handler可以catch住所有abort(404)以及找不到對(duì)應(yīng)router的處理請(qǐng)求"""
res = {"status": 404, "message": "404錯(cuò)誤,找不到對(duì)應(yīng)router"}
return Response(json.dumps(res), mimetype='application/json')
@exception.app_errorhandler(405)
def error_405(error):
"""這個(gè)handler可以catch住所有abort(405)以及請(qǐng)求方式有誤的請(qǐng)求"""
res = {"status": 405, "message": "請(qǐng)求方式有誤"}
return Response(json.dumps(res), mimetype='application/json')
# @exception.app_errorhandler(Exception)
# def error_500(error):
# """這個(gè)handler可以catch住所有的abort(500)和raise exeception."""
# res = {"status": 500, "message": "系統(tǒng)內(nèi)部錯(cuò)誤"}
# return Response(json.dumps(res), mimetype='application/json')
class MyError(Exception):
"""自定義錯(cuò)誤類"""
pass
然后在flask啟動(dòng)文件中新增如下代碼:
# 導(dǎo)入error.py文件中的exception藍(lán)圖
from error import exception
from flask import Flask, request, Response
app = Flask(__name__)
# 注冊(cè)藍(lán)圖返奉,并指定其對(duì)應(yīng)的前綴(url_prefix)
app.register_blueprint(exception, url_prefix='/error')
# 以下可以寫業(yè)務(wù)代碼
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8089, debug=False, threaded=True)
注意
當(dāng)我們不是使用的工廠模式創(chuàng)建app時(shí)贝搁,app.errorhandler(401),即可捕捉全局401狀態(tài)衡瓶;若使用了create_app方式創(chuàng)建app徘公,則無法進(jìn)行捕捉,若想捕捉哮针,可以在藍(lán)圖中寫关面,如admin.errorhandler(401),即捕捉admin藍(lán)圖下所有401狀態(tài)碼十厢,admin.app_errorhandler(401)等太,則是捕捉的全局的401狀態(tài)碼,即其他藍(lán)圖中的401狀態(tài)蛮放,也會(huì)被捕捉缩抡,進(jìn)行處理。