当前位置: 首页 > 面试题库 >

全局错误处理程序的任何异常

仲智
2023-03-14
问题内容

有没有一种方法可以添加一个全局包罗万象的错误处理程序,可以在其中将响应更改为通用JSON响应?

我无法使用该got_request_exception信号,因为它不允许修改响应(http://flask.pocoo.org/docs/0.10/signals/)。

相反,所有信号处理程序均以未定义的顺序执行,并且不修改任何数据。

我宁愿不要包装该app.handle_exception函数,因为感觉就像是内部API。我想我正在寻找类似的东西:

 @app.errorhandler()
 def handle_global_error(e):
     return "Global error"

请注意,errorhandler不会接受任何参数,这意味着它将捕获所有未附加特定错误处理程序的异常/状态代码。我知道我可以使用errorhandler(500)errorhandler(Exception)捕获异常,但是abort(409)例如,如果这样做,它将仍然返回HTML响应。


问题答案:

您可以使用@app.errorhandler(Exception)

演示(HTTPException检查可确保保留状态码):

from flask import Flask, abort, jsonify
from werkzeug.exceptions import HTTPException

app = Flask('test')

@app.errorhandler(Exception)
def handle_error(e):
    code = 500
    if isinstance(e, HTTPException):
        code = e.code
    return jsonify(error=str(e)), code

@app.route('/')
def index():
    abort(409)

app.run(port=1234)

输出:

$ http get http://127.0.0.1:1234/
HTTP/1.0 409 CONFLICT
Content-Length: 31
Content-Type: application/json
Date: Sun, 29 Mar 2015 17:06:54 GMT
Server: Werkzeug/0.10.1 Python/3.4.3

{
    "error": "409: Conflict"
}

$ http get http://127.0.0.1:1234/notfound
HTTP/1.0 404 NOT FOUND
Content-Length: 32
Content-Type: application/json
Date: Sun, 29 Mar 2015 17:06:58 GMT
Server: Werkzeug/0.10.1 Python/3.4.3

{
    "error": "404: Not Found"
}

如果您还想覆盖Flask的默认HTML异常(以便它们也返回JSON),请在以下内容之前添加以下内容app.run

from werkzeug.exceptions import default_exceptions
for ex in default_exceptions:
    app.register_error_handler(ex, handle_error)

对于较旧的Flask版本(<= 0.10.1,即当前的任何非git / master版本),将以下代码添加到您的应用程序中以显式注册HTTP错误:

from werkzeug import HTTP_STATUS_CODES
for code in HTTP_STATUS_CODES:
    app.register_error_handler(code, handle_error)


 类似资料:
  • 问题内容: 当我的网站是100%jQuery时,我曾经这样做: 为401错误设置全局处理程序。现在,我将angularjs与和一起使用,以向服务器发送(REST)请求。有什么办法可以类似地用角度设置全局错误处理程序吗? 问题答案: 我还在建立一个带有angular的网站,并且遇到了同样的障碍来处理全局401。当我遇到此博客文章时,我最终使用了HTTP拦截器。也许您会发现它和我一样有用。 “基于An

  • 问题内容: 有没有一种方法可以在Java中创建全局异常处理程序。我想这样使用: 处理程序可能无法捕获在主体中引发的异常。 马丁 问题答案: 使用Thread.setDefaultUncaughtExceptionHandler。有关示例,请参见Rod Hilton的“ Global Exception Handling ”博客文章。

  • 问题内容: 我有一个应用程序,需要编写一个自定义的全局未捕获的异常处理程序。我已经阅读了所有stackoverflow线程,并且其中每个线程都只是缺少一个清晰而简单的示例,说明了如何实现这一点。 考虑以下简单示例: 它抛出一个标准异常,它只是一个标准输出。我如何实现自己的异常,该异常可以通过将错误输出到日志文件中的简单方法覆盖标准异常?显然,实际的应用程序要大得多,我们正在谈论未捕获的异常,这就是

  • 统一错误处理 文档:https://eggjs.org/zh-cn/tutorials/restful.html 自定义一个异常基类 // app / exceptions / http_exceptions.js class HttpExceptions extends Error { constructor(msg='服务器异常', code=1, httpCode=400) {

  • 我正在尝试为我的骆驼上下文中的所有路由抛出的所有异常配置一个异常处理程序。我的做法是这样的,没有运气: 实例化默认骆驼上下文 从spring上下文检索RouteDefinition列表 通过调用CTX.AddRouteDefinitions()将这些定义添加到camel上下文 从java dsl定义的RotueBuilder添加我的异常处理程序路由(ctx.addRoutes(new MyErro

  • 我有一个带post请求的控制器。我试图用一个简单的NotNull注释验证POJO。我正在使用ControllerAdvice来处理异常。 所以我尝试使用它,但当我启动应用程序时,我得到了以下信息: 因此,我想为BindException创建自己的处理程序,但当我为BindException类创建ExceptionHandler时,spring应用程序不会启动。如果我注释掉handleBindExc