flask項目統一捕獲異常並自定義異常信息


背景:

     在日常編寫了一些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狀態,也會被捕捉,進行處理
 
 
文章來源:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM