flask項(xiàng)目統(tǒng)一捕獲異常并自定義異常信息

背景

在日常開發(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)行處理。

文章來源:https://www.cnblogs.com/huchong/p/9205651.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末包颁,一起剝皮案震驚了整個(gè)濱河市瞻想,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌娩嚼,老刑警劉巖蘑险,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異岳悟,居然都是意外死亡佃迄,警方通過查閱死者的電腦和手機(jī)泼差,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呵俏,“玉大人堆缘,你說我怎么就攤上這事∑账椋” “怎么了吼肥?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)随常。 經(jīng)常有香客問我潜沦,道長(zhǎng),這世上最難降的妖魔是什么绪氛? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮涝影,結(jié)果婚禮上枣察,老公的妹妹穿的比我還像新娘。我一直安慰自己燃逻,他們只是感情好序目,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伯襟,像睡著了一般猿涨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姆怪,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天叛赚,我揣著相機(jī)與錄音,去河邊找鬼稽揭。 笑死俺附,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的溪掀。 我是一名探鬼主播事镣,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼揪胃!你這毒婦竟也來了璃哟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤喊递,失蹤者是張志新(化名)和其女友劉穎随闪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體册舞,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蕴掏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盛杰。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挽荡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出即供,到底是詐尸還是另有隱情定拟,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布逗嫡,位于F島的核電站青自,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏驱证。R本人自食惡果不足惜延窜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抹锄。 院中可真熱鬧逆瑞,春花似錦、人聲如沸伙单。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吻育。三九已至念秧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間布疼,已是汗流浹背摊趾。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缎除,地道東北人严就。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像器罐,于是被迫代替她去往敵國(guó)和親梢为。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355