背景:
在日常編寫了一些flask項目,主要用於測試方面的mock場景,但迭代到后期發現有時候會拋出各種亂七八糟的異常或者直接500且沒有任何異常信息,這種情況一般都是某個代碼塊沒有用try來進行異常捕獲;又或者是api的地址編寫有誤,直接拋出404了,這類提示都很不友好,故結合網上的教材,進行了針對異常的統一捕獲並自動以了異常信息,用於接口回顯,這樣相對來說,對於使用者友好一些
errorhandler
errorhandler捕捉當前app或藍圖的狀態碼,並進行自定制處理
下面是一份示例代碼,admin是一個藍本或者app,發生404錯誤或500錯誤,會返回一個Json對象給請求段
1 from flask import jsonify 2 from . import admin 3 @admin.errorhandler(404) 4 def error_404(error): 5 """這個handler可以catch住所有abort(404)以及找不到對應router的處理請求""" 6 response = dict(status=0, message="404 Not Found") 7 return jsonify(response), 404 8 @admin.errorhandler(Exception) 9 def error_500(error): 10 """這個handler可以catch住所有的abort(500)和raise exeception.""" 11 response = dict(status=0, message="500 Error") 12 return jsonify(response), 400 13 class MyError(Exception): 14 """自定義錯誤類""" 15 pass 16 @admin.errorhandler(MyError) 17 def MyErrorHandle(error): 18 response = dict(status=0, message="400 Error") 19 return jsonify(response), 400
app_errorhandler
app_errorhandler捕捉全局狀態碼,並進行自定制異常處理
在藍本中編寫錯誤處理程序有點不同,如果使用errorhandler修飾器,那么只有藍本中的錯誤才會觸發。如果想注冊全局的錯誤處理程序,要用app_errorhandler
1 from . import auth 2 @auth.app_errorhandler(404) 3 def error_404(error): 4 response = dict(status=0, message="404 Not Found") 5 return jsonify(response), 404
實踐
以下代碼為我自己項目中的實現:
首先新建一個error.py文件
1 import json 2 from flask import Blueprint, Response 3 4 exception = Blueprint('exception',__name__) 5 6 @exception.app_errorhandler(404) 7 def error_404(error): 8 """這個handler可以catch住所有abort(404)以及找不到對應router的處理請求""" 9 res = {"status": 404, "message": "404錯誤,找不到對應router"} 10 return Response(json.dumps(res), mimetype='application/json') 11 12 @exception.app_errorhandler(405) 13 def error_405(error): 14 """這個handler可以catch住所有abort(405)以及請求方式有誤的請求""" 15 res = {"status": 405, "message": "請求方式有誤"} 16 return Response(json.dumps(res), mimetype='application/json') 17 18 # @exception.app_errorhandler(Exception) 19 # def error_500(error): 20 # """這個handler可以catch住所有的abort(500)和raise exeception.""" 21 # res = {"status": 500, "message": "系統內部錯誤"} 22 # return Response(json.dumps(res), mimetype='application/json') 23 24 class MyError(Exception): 25 """自定義錯誤類""" 26 pass
然后在flask啟動文件中新增如下代碼:
1 # 導入error.py文件中的exception藍圖 2 from error import exception 3 from flask import Flask, request, Response 4 5 6 app = Flask(__name__) 7 # 注冊藍圖,並指定其對應的前綴(url_prefix) 8 app.register_blueprint(exception, url_prefix='/error') 9 # 以下可以寫業務代碼 10 11 12 if __name__ == '__main__': 13 app.run(host='0.0.0.0', port=8089, debug=False, threaded=True)
補充說明
當我們不是使用的工廠模式創建app時,app.errorhandler(401),即可捕捉全局401狀態;若使用了create_app方式創建app,則無法進行捕捉,若想捕捉,可以在藍圖中寫,如admin.errorhandler(401),即捕捉admin藍圖下所有401狀態碼,admin.app_errorhandler(401),則是捕捉的全局的401狀態碼,即其他藍圖中的401狀態,也會被捕捉,進行處理
文章來源: