如何在Flask中進行異常處理實例解析
正文
在系統(tǒng)運行中,有時候需要處理報錯異常。
異常的來源可能是系統(tǒng)在運行中的報錯,比如錯誤的運算的有 1/0 這種等,還有的是訪問了不存在接口,又或者,我們在查驗接口參數(shù)的時候,發(fā)現(xiàn)沒有傳必傳參數(shù),需要手動觸發(fā)一個報錯等。
這里就介紹如何在 Flask 中進行異常處理。
本篇筆記的代碼都已經提交到 github 上,可使用下面的操作獲取代碼:
git clone https://github.com/x1204604036/flask_backend.git
1、異常處理示例
這里以請求的接口不存在為示例介紹一下異常處理流程。
處理一個異常,需要先對指定的異常進行注冊,對于請求接口不存在這種請求相關的異常,F(xiàn)lask 里定義了一個 HTTPException 異常對其進行處理
這里我們在 app/ 下創(chuàng)建一個文件夾 utils,再創(chuàng)建一個文件 exception_handler.py:
# app/utils/exception_handler.py
from werkzeug.exceptions import HTTPException
from flask import jsonify
def init_error_exception(app):
@app.errorhandler(HTTPException)
def handler_http_exception(exception):
print(exception)
return jsonify({"code": -1, "msg": exception.description}), exception.code這里創(chuàng)建了一個異常處理的函數(shù),通過 @app.errorhandler(HTTPException) 的方式注冊,在 app/__init__.py 中引入:
from flask import Flask
from app.utils.exception_handler import init_error_exception
def create_app():
app = Flask(__name__)
init_error_exception(app)
return appflask.jsonify 用來返回 json 數(shù)據(jù)給客戶端,后面跟著的是 HTTP 的 status code,就是 200,500 那些表示請求狀態(tài)的的狀態(tài)碼
這里我們用 postman 請求一個不存在的接口,就可以看到返回的信息如下:
{
"code": -1,
"msg": "The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again."
}status code 是 404,表示接口不存在
這樣,關于 HTTP 請求的異常處理就從注冊,到觸發(fā),到返回結果完成了一個閉環(huán)。
2、其他異常處理
除了上面的請求異常,可能還有一些異常,比如我們在接口里進行了 1/0 等不合法的運算,為了捕捉這種報錯,我們可以如下操作:
ERROR_HTTP_CODE = 417
def init_error_exception(app):
@app.errorhandler(Exception)
def server_exception(exception):
print(exception)
return jsonify({"code": -1, "msg": "內部錯誤"}), ERROR_HTTP_CODE這樣,在系統(tǒng)里發(fā)生異常異常之后,就會被捕捉,返回給客戶端 內部錯誤 的信息
還有一些時候,舉個例子,比如在接口里,客戶端沒有傳來一些必傳的參數(shù),我們可以手動觸發(fā)一個報錯,自定義報錯信息和HTTP狀態(tài)碼,可以如下這樣操作:
class UserException(Exception):
def __init__(self, code=-1, msg="error", http_code=417):
self.code = code
self.msg = msg
self.http_code = http_code
def init_error_exception(app):
@app.errorhandler(UserException)
def user_exception(exception):
print(exception)
return jsonify({"code": exception.code, "msg": exception.msg}), exception.http_code然后我們在接口里這樣調用觸發(fā)異常:
raise UserException(msg="手動測試error", http_code=417)
我們可以傳入 code,msg 和 http_code 參數(shù),用于返回給前端
以上這些介紹的都是異常的處理,還可以在處理異常的時候打印日志,用于記錄報錯的信息,這個我們后面介紹日志的時候再介紹。
3、代碼總覽
以下給出前面介紹的三種異常處理的代碼:
# app/utils/exception_handler.py
from werkzeug.exceptions import HTTPException
from flask import jsonify
ERROR_HTTP_CODE = 417
class UserException(Exception):
def __init__(self, code=-1, msg="error", http_code=417):
self.code = code
self.msg = msg
self.http_code = http_code
def init_error_exception(app):
@app.errorhandler(HTTPException)
def handler_http_exception(exception):
print(exception)
return jsonify({"code": -1, "msg": exception.description}), exception.code
@app.errorhandler(Exception)
def server_exception(exception):
print(exception)
return jsonify({"code": -1, "msg": "內部錯誤"}), ERROR_HTTP_CODE
@app.errorhandler(UserException)
def user_exception(exception):
print(exception)
return jsonify({"code": exception.code, "msg": exception.msg}), exception.http_code記得要在 app/__init__.py 中引入初始化處理哦
以上就是如何在Flask中進行異常處理實例解析的詳細內容,更多關于Flask異常處理的資料請關注腳本之家其它相關文章!
相關文章
Pytorch之ToPILImage()不輸出圖片問題及解決
這篇文章主要介紹了Pytorch之ToPILImage()不輸出圖片問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02
精選39道Python數(shù)據(jù)分析面試題提早備戰(zhàn)金三銀四
這篇文章主要為大家介紹了39道Python數(shù)據(jù)分析的面試題問答攻略幫助大家提早備戰(zhàn)金三銀四,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多精進,早日度過寒冬2023-12-12
在pycharm中為項目導入anacodna環(huán)境的操作方法
這篇文章主要介紹了在pycharm中為項目導入anacodna環(huán)境的操作方法,本文圖文并茂通過實例詳解的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02
python3.4用函數(shù)操作mysql5.7數(shù)據(jù)庫
這篇文章主要為大家詳細介紹了python3.4用函數(shù)操作mysql5.7數(shù)據(jù)庫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
Python Django教程之實現(xiàn)天氣應用程序
Django提供了一個基于Python Web框架的Web框架,允許快速開發(fā)和干凈,務實的設計。在本教程中,我們將學習如何創(chuàng)建一個使用Django作為后端的天氣應用程序,感興趣的可以嘗試一下2022-10-10

