首页 新闻 会员 周边

使用@app.errorhandler(Exception)装饰器后是否可以返回原始结果

0
悬赏园豆:10 [待解决问题]

我使用这个装饰器记录app中的所有异常,但似乎需要自定义返回值。我只想记录,不想改变原来的显示结果。是否有方法返回原始默认值,并且当debug=true时发生异常时,将返回调试窗口。

@app.errorhandler(Exception)
def exceptions(e):
    if isinstance(e, HTTPException):
        return e
    logger.exception(e)
    return InternalServerError()
不识少年愁的主页 不识少年愁 | 初学一级 | 园豆:62
提问于:2021-10-29 09:40
< >
分享
所有回答(1)
0

“只想记录,不想改变原来的显示结果。是否有方法返回原始默认值”
原生的 errorhandler 装饰器,貌似满足不了你的想法(PS:你这个 ‘原来的显示结果’ 很难理解‘,你是指 flask 原有的异常页面还是啥)
errorhandler 源码解析参考:https://www.jianshu.com/p/5d4017b71eb2

方案:
1、封装一个属于你自己的 errorhandler
2、不采用全局异常处理, 将异常处理分摊到每个视图函数

# 以下是目前 errorhandler ,比较完美的使用方案了
https://www.cnblogs.com/luyuze95/p/12937704.html


@app.errorhandler(Exception)
def framework_error(e):
    api_logger.error("error info: %s" % e) # 对错误进行日志记录
    if isinstance(e, APIException):
        return e
    if isinstance(e, HTTPException):
        code = e.code
        msg = e.description
        error_code = 1007
        return APIException(msg, code, error_code)
    else:
        if not app.config['DEBUG']:
            return ServerError()
        else:
            return e
〆灬丶 | 园豆:2287 (老鸟四级) | 2021-11-01 13:56

您好,原来的显示结果是指,当debug=False时,显示flask原生404、500页面,当debug=True时,500显示异常跟踪调试页面,总之不能返回任何自定义的东西。接手一个庞大的项目,我本来不是做这块的,所以不能改原来的代码。由于项目使用了flask_restplus,重写了flask原生异常处理机制,原生app.logger也不会自动记录异常。你这个代码最后一行是错误的。返回值只能是string, dict, tuple, Response instance,你返e直接报TypeError了

支持(0) 反对(0) 不识少年愁 | 园豆:62 (初学一级) | 2021-11-01 14:16

@不识少年愁:
”当debug=True时,500显示异常跟踪调试页面“ 不要搞这些东西了;测试环境有吧,去研究一下 rpdb ,比你折腾调试页面方便很多

支持(0) 反对(0) 〆灬丶 | 园豆:2287 (老鸟四级) | 2021-11-01 15:44

@韆: 不是我想用什么就用什么,得看领导要求。目前return app.handle_exception(e),所有异常页面都正常,但不知道会不会有什么隐患。

@app.errorhandler(Exception)
def exceptions(e):
    if isinstance(e, HTTPException):
        return e
    logger.exception(e)
    if not app.debug:
        return InternalServerError()
    else:
        return app.handle_exception(e)
支持(0) 反对(0) 不识少年愁 | 园豆:62 (初学一级) | 2021-11-02 10:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册