You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Flask应用不再抛出404错误?已配置处理器仍报错

Flask 404错误处理器正常工作但仍输出NotFound堆栈,如何阻止?

问题描述

我在Flask应用中配置了如下404错误处理器:

@app.errorhandler(404)
def handle_not_found_error(exc):
    err_code = util.generate_uuid()[:6]

    app.logger.error(f"Error code: {err_code}")
    app.logger.exception(exc)

    response = {
        "message": "PATH_NOT_FOUND",
        "status": 404,
        "errors": {
            "type": "PATH_NOT_FOUND",
            "reason": (
                "{} is not a valid path. "
                "Please check the URL and try again. "
                "Error code: {}"
                ).format(
                    request.path,
                    err_code
                ),
        }
    }

    # 创建自定义JSON响应
    return make_response(response, 404)

该处理器可正常捕获NotFound错误并返回预期的JSON响应,但每次出现404错误时仍会输出如下堆栈跟踪信息:

Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/flask/app.py", line 1820, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/flask/app.py", line 1785, in dispatch_request
    self.raise_routing_exception(req)
  File "/usr/local/lib/python3.11/site-packages/flask/app.py", line 1767, in raise_routing_exception
    raise request.routing_exception  # type: ignore
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/flask/ctx.py", line 351, in match_request
    result = self.url_adapter.match(return_rule=True)  # type: ignore
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/werkzeug/routing/map.py", line 655, in match
    raise NotFound() from None
werkzeug.exceptions.NotFound: 404 Not Found: The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.
192.168.65.1 - - [21/Apr/2025:03:19:30 +0000] "GET /trading/iday-ita/ HTTP/1.1" 404 183 "-" "PostmanRuntime/7.43.0" "-"

想知道是否可以阻止该堆栈信息的输出?

解决方案

1. 替换logger.exception为logger.error

你看到的堆栈跟踪是由代码中的app.logger.exception(exc)触发的——这个方法的设计就是自动记录ERROR级别的日志并附带完整的异常堆栈,哪怕错误已经被处理器捕获。

如果不需要输出堆栈,只需要记录错误代码和异常信息,把这行替换为:

app.logger.error(f"Error code: {err_code}, 404错误路径: {request.path}")

2. (可选)调整Flask日志级别

如果应用日志级别设置为DEBUG,Flask可能会输出额外的路由调试信息。可以在应用初始化时把日志级别调整为INFO或ERROR,减少冗余输出:

import logging
app.logger.setLevel(logging.INFO)

3. 确认错误处理器的注册方式

确保你的错误处理器针对werkzeug.exceptions.NotFound正确注册(Flask的@app.errorhandler(404)已默认关联该异常,但显式指定可避免潜在问题):

from werkzeug.exceptions import NotFound

@app.errorhandler(NotFound)
def handle_not_found_error(exc):
    # 你的处理逻辑

完成以上修改后,404错误会被正常处理并返回JSON响应,同时不会再输出多余的堆栈跟踪信息。

内容的提问来源于stack exchange,提问作者Sultan Fahrezy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 08:48:42