Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 668|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-5-15 18:01:43 | 显示全部楼层 |阅读模式

    背景:

         在日常编写了一些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状态,也会被捕捉,进行处理
     
     
    文章来源:

     

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-18 16:59 , Processed in 0.063780 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表