错误处理
统一处理异常与错误页面,避免把堆栈信息暴露给用户,同时提高代码可维护性。
注册错误处理器
用 @app.errorhandler 为特定 HTTP 状态码注册处理函数:
处理器必须显式返回状态码(第二个返回值),否则响应会是 200。
主动抛出错误:abort
abort() 抛出 werkzeug.exceptions.HTTPException,会被对应状态码的错误处理器捕获;description 可在处理器中通过 e.description 读取。
自定义业务异常
为 API 定义携带状态码和消息的异常类,让视图代码保持干净:
捕获所有未处理异常
注册 Exception 级别的处理器作为兜底,但要放行 HTTP 异常:
API 与页面的内容协商
同一个应用同时有页面和 API 时,根据请求偏好返回 HTML 或 JSON:
蓝图级错误处理
蓝图可以注册只作用于自己的处理器:
注意:404/405 这类由路由系统在进入蓝图之前抛出的错误,只能由应用级处理器捕获,蓝图级的 errorhandler(404) 不会生效。
与日志结合
- 500 级错误务必用
app.logger.exception()记录完整堆栈(参见日志章节)。 - 4xx 一般是客户端问题,记录为
warning或不记录,避免日志噪音。