0

0

Python如何处理Web异常_全局异常拦截器与统一JSON返回格式定制

P粉602998670

P粉602998670

发布时间:2026-03-18 13:25:03

|

493人浏览过

|

来源于php中文网

原创

Flask需用@app.errorhandler(HTTPException)捕获HTTP异常、@app.errorhandler(Exception)兜底未处理异常;Django需自定义中间件在DEBUG=False时重写process_exception;FastAPI需显式注册各类exception_handler并注意依赖异常捕获范围。

python如何处理web异常_全局异常拦截器与统一json返回格式定制

Flask里怎么统一捕获所有HTTP异常并返回JSON

直接用 @app.errorhandler 注册通用异常处理器,但要注意:它只捕获由 Flask 主动抛出的 HTTPException(比如 404500),不抓未处理的 Python 异常(如 KeyErrorValueError)。

所以必须额外注册 @app.errorhandler(Exception) 来兜底,但这里要小心——它会吃掉所有未被捕获的异常,包括你本想让开发环境报错中断的逻辑错误。

  • 生产环境才开启 @app.errorhandler(Exception),开发时建议保留原始 traceback
  • 在兜底 handler 里手动区分是否为 HTTPException,避免重复包装:用 isinstance(e, HTTPException)
  • 返回前务必设响应状态码,否则默认是 200,前端可能误判成功
from flask import jsonify
from werkzeug.exceptions import HTTPException

@app.errorhandler(HTTPException)
def handle_http_exception(e):
    return jsonify({"code": e.code, "msg": e.description}), e.code

@app.errorhandler(Exception)
def handle_unexpected_exception(e):
    if isinstance(e, HTTPException):
        return handle_http_exception(e)
    app.logger.exception("Unhandled exception")
    return jsonify({"code": 500, "msg": "Internal error"}), 500

Django中如何替换默认的500页面并返回JSON

Django 的全局异常处理靠中间件和 DEFAULT_EXCEPTION_REPORTER_FILTER 配合,但真正拦截 500 并改返回格式,得靠自定义中间件 + 覆盖 process_exception 方法。

关键点在于:Django 默认在 DEBUG=True 时返回 HTML 调试页,这个行为无法用中间件绕过;只有 DEBUG=False 才走 process_exception,且此时必须确保 ALLOWED_HOSTS 配置正确,否则连 500 都不会触发你的逻辑。

立即学习Python免费学习笔记(深入)”;

  • 中间件必须放在 MIDDLEWARE 列表靠前位置(比如第二位),否则可能被后续中间件提前终止
  • 不要在 process_exception 里 raise 新异常,否则会进 Django 默认错误页
  • 如果用了 DRF,优先用 EXCEPTION_HANDLER,它比中间件更精准,且天然支持 Response 对象
class JsonExceptionHandler:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        return self.get_response(request)

    def process_exception(self, request, exception):
        if settings.DEBUG:
            return
        return JsonResponse({"code": 500, "msg": "Server error"}, status=500)

FastAPI里为什么exception_handler不生效

FastAPI 的异常处理器默认只对显式 raise 的异常生效,比如 HTTPException 或你自定义的继承自 HTTPException 的类。它不捕获路径函数内部未处理的普通异常(如 ZeroDivisionError),除非你手动加了 @app.exception_handler(Exception)

Buildt.ai
Buildt.ai

AI驱动的软件开发平台,可以自动生成代码片段、代码分析及其他自动化任务

下载

更大的坑是:如果你用了 Depends,而依赖函数里抛了异常,默认不会被路由层的 exception handler 捕获——得单独给依赖加 @app.exception_handler,或者把依赖异常转成 HTTPException 再抛。

  • 全局 handler 必须在 app = FastAPI() 实例化之后注册,不能写在 import 阶段
  • RequestValidationError 是 Pydantic 错误,需单独注册 @app.exception_handler(RequestValidationError)
  • handler 函数参数签名必须严格匹配,比如带 request: Request 就不能漏掉
from fastapi import Request, HTTPException
from fastapi.responses import JSONResponse

@app.exception_handler(HTTPException)
async def http_exception_handler(request, exc):
    return JSONResponse({"code": exc.status_code, "msg": exc.detail}, status_code=exc.status_code)

@app.exception_handler(Exception)
async def generic_exception_handler(request, exc):
    return JSONResponse({"code": 500, "msg": "Internal error"}, status_code=500)

统一JSON结构里要不要包含data字段

要不要加 data 字段,本质是接口契约问题,不是技术限制。但一旦选了,就得全项目一致,否则前端要写两套解析逻辑。

常见做法是:成功响应放 data,失败放 msgcode;但注意 data 类型必须可预测——比如列表接口返回 {"data": []},空对象接口返回 {"data": {}},别混用 None 或省略字段。

  • 分页接口容易踩坑:是把 data 设为列表,还是包一层 {"list": [], "total": 100}?推荐后者,避免前端每次都要判断 data 类型
  • 如果后端有多个服务共用同一套前端,data 字段名最好配置化,别硬编码在每个 handler 里
  • 别为了“统一”强行塞 data: null,空响应直接返回 {"code": 0, "msg": "ok"} 更干净

最麻烦的是历史接口迁移:旧接口没 data,新接口加了,中间网关或 BFF 层就得做字段透传或转换——这种兼容性成本,往往比一开始定规范还高。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

169

2026.02.04

Python Flask框架
Python Flask框架

本专题专注于 Python 轻量级 Web 框架 Flask 的学习与实战,内容涵盖路由与视图、模板渲染、表单处理、数据库集成、用户认证以及RESTful API 开发。通过博客系统、任务管理工具与微服务接口等项目实战,帮助学员掌握 Flask 在快速构建小型到中型 Web 应用中的核心技能。

106

2025.08.25

Python Flask Web框架与API开发
Python Flask Web框架与API开发

本专题系统介绍 Python Flask Web框架的基础与进阶应用,包括Flask路由、请求与响应、模板渲染、表单处理、安全性加固、数据库集成(SQLAlchemy)、以及使用Flask构建 RESTful API 服务。通过多个实战项目,帮助学习者掌握使用 Flask 开发高效、可扩展的 Web 应用与 API。

81

2025.12.15

什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

184

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

226

2025.12.18

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

458

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

3

2026.03.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号