如何在Flask中進(jìn)行異常處理實(shí)例解析
正文
在系統(tǒng)運(yùn)行中,有時(shí)候需要處理報(bào)錯(cuò)異常。
異常的來源可能是系統(tǒng)在運(yùn)行中的報(bào)錯(cuò),比如錯(cuò)誤的運(yùn)算的有 1/0 這種等,還有的是訪問了不存在接口,又或者,我們在查驗(yàn)接口參數(shù)的時(shí)候,發(fā)現(xiàn)沒有傳必傳參數(shù),需要手動(dòng)觸發(fā)一個(gè)報(bào)錯(cuò)等。
這里就介紹如何在 Flask 中進(jìn)行異常處理。
本篇筆記的代碼都已經(jīng)提交到 github 上,可使用下面的操作獲取代碼:
git clone https://github.com/x1204604036/flask_backend.git
1、異常處理示例
這里以請求的接口不存在為示例介紹一下異常處理流程。
處理一個(gè)異常,需要先對指定的異常進(jìn)行注冊,對于請求接口不存在這種請求相關(guān)的異常,F(xiàn)lask 里定義了一個(gè) HTTPException 異常對其進(jìn)行處理
這里我們在 app/ 下創(chuàng)建一個(gè)文件夾 utils,再創(chuàng)建一個(gè)文件 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)建了一個(gè)異常處理的函數(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 app
flask.jsonify 用來返回 json 數(shù)據(jù)給客戶端,后面跟著的是 HTTP 的 status code,就是 200,500 那些表示請求狀態(tài)的的狀態(tài)碼
這里我們用 postman 請求一個(gè)不存在的接口,就可以看到返回的信息如下:
{ "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,表示接口不存在
這樣,關(guān)于 HTTP 請求的異常處理就從注冊,到觸發(fā),到返回結(jié)果完成了一個(gè)閉環(huán)。
2、其他異常處理
除了上面的請求異常,可能還有一些異常,比如我們在接口里進(jìn)行了 1/0 等不合法的運(yùn)算,為了捕捉這種報(bào)錯(cuò),我們可以如下操作:
ERROR_HTTP_CODE = 417 def init_error_exception(app): @app.errorhandler(Exception) def server_exception(exception): print(exception) return jsonify({"code": -1, "msg": "內(nèi)部錯(cuò)誤"}), ERROR_HTTP_CODE
這樣,在系統(tǒng)里發(fā)生異常異常之后,就會(huì)被捕捉,返回給客戶端 內(nèi)部錯(cuò)誤
的信息
還有一些時(shí)候,舉個(gè)例子,比如在接口里,客戶端沒有傳來一些必傳的參數(shù),我們可以手動(dòng)觸發(fā)一個(gè)報(bào)錯(cuò),自定義報(bào)錯(cuò)信息和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
然后我們在接口里這樣調(diào)用觸發(fā)異常:
raise UserException(msg="手動(dòng)測試error", http_code=417)
我們可以傳入 code,msg 和 http_code 參數(shù),用于返回給前端
以上這些介紹的都是異常的處理,還可以在處理異常的時(shí)候打印日志,用于記錄報(bào)錯(cuò)的信息,這個(gè)我們后面介紹日志的時(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": "內(nèi)部錯(cuò)誤"}), 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中進(jìn)行異常處理實(shí)例解析的詳細(xì)內(nèi)容,更多關(guān)于Flask異常處理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python基礎(chǔ)實(shí)戰(zhàn)總結(jié)
今天要給大家介紹的是Python基礎(chǔ)實(shí)戰(zhàn),本文主要以舉例說明講解:問題的關(guān)鍵點(diǎn)就是在于構(gòu)造姓名,學(xué)號(hào)和成績,之后以字典的形式進(jìn)行寫入文件。這里準(zhǔn)備兩個(gè)列表,一個(gè)姓,一個(gè)名,之后使用random庫進(jìn)行隨機(jī)字符串拼接,得到姓名,需要的朋友可以參考一下2021-10-10Python 3.x對.CSV數(shù)據(jù)按任意行、列讀取的過程
這篇文章主要介紹了Python 3.x對.CSV數(shù)據(jù)按任意行、列讀取的過程,具有很好的參考價(jià)值,希望對大家有所幫助。2022-05-05Pandas中`ValueError: cannot reindex from
在Pandas中,ValueError: cannot reindex from a duplicate axis錯(cuò)誤通常發(fā)生在嘗試對包含重復(fù)索引的DataFrame或Series進(jìn)行重新索引(reindex)時(shí),所以本文介紹了Pandas中`ValueError: cannot reindex from a duplicate axis`錯(cuò)誤分析及解決辦法,需要的朋友可以參考下2024-07-07python學(xué)習(xí)--使用QQ郵箱發(fā)送郵件代碼實(shí)例
這篇文章主要介紹了python使用QQ郵箱發(fā)送郵件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04