flask项目统一捕获异常并自定义异常信息

背景

在日常开发过程中,迭代到后期发现有时候会抛出各种乱七八糟的异常或者直接500且没有任何异常信息,这种情况一般都是某个代码块没有用try来进行异常捕获;又或者是api的地址编写有误,直接抛出404了,这类提示都很不友好,故结合网上的教材,进行了针对异常的统一捕获并自动以了异常信息,用于接口回显,这样相对来说,对于使用者友好一些。

errorhandler

errorhandler捕捉当前app或蓝图的状态码,并进行自定制处理
下面是一份示例代码,admin是一个蓝本或者app,发生404错误或500错误,会返回一个Json对象给请求段。

from flask import jsonify
from . import admin
@admin.errorhandler(404)
def error_404(error):
    """这个handler可以catch住所有abort(404)以及找不到对应router的处理请求"""
    response = dict(status=0, message="404 Not Found")
    return jsonify(response), 404
@admin.errorhandler(Exception)
def error_500(error):
    """这个handler可以catch住所有的abort(500)和raise exeception."""
    response = dict(status=0, message="500 Error")
    return jsonify(response), 400
class MyError(Exception):
    """自定义错误类"""
    pass
@admin.errorhandler(MyError)
def MyErrorHandle(error):
    response = dict(status=0, message="400 Error")
    return jsonify(response), 400

app_errorhandler

app_errorhandler捕捉全局状态码,并进行自定制异常处理
在蓝本中编写错误处理程序有点不同,如果使用errorhandler修饰器,那么只有蓝本中的错误才会触发。如果想注册全局的错误处理程序,要用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

应用

以下代码为自己项目中的实现:
首先新建一个error.py文件

import json
from flask import Blueprint, Response

exception = Blueprint('exception',__name__)

@exception.app_errorhandler(404)
def error_404(error):
    """这个handler可以catch住所有abort(404)以及找不到对应router的处理请求"""
    res = {"status": 404, "message": "404错误,找不到对应router"}
    return Response(json.dumps(res), mimetype='application/json')

@exception.app_errorhandler(405)
def error_405(error):
    """这个handler可以catch住所有abort(405)以及请求方式有误的请求"""
    res = {"status": 405, "message": "请求方式有误"}
    return Response(json.dumps(res), mimetype='application/json')

# @exception.app_errorhandler(Exception)
# def error_500(error):
#     """这个handler可以catch住所有的abort(500)和raise exeception."""
#     res = {"status": 500, "message": "系统内部错误"}
#     return Response(json.dumps(res), mimetype='application/json')

class MyError(Exception):
    """自定义错误类"""
    pass

然后在flask启动文件中新增如下代码:

# 导入error.py文件中的exception蓝图
from error import exception
from flask import Flask, request, Response


app = Flask(__name__)
# 注册蓝图,并指定其对应的前缀(url_prefix)
app.register_blueprint(exception, url_prefix='/error')
# 以下可以写业务代码


if __name__ == '__main__':
    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状态,也会被捕捉,进行处理。

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。