本页面介绍了 Gin 框架提供的错误处理机制。Gin 中的错误处理涉及在请求处理过程中收集错误、在必要时中止请求处理以及从 panic 中恢复。有关验证错误的具体信息,请参阅数据验证。
Gin 提供了多种错误处理机制:
来源:errors.go14-38 context.go226-232 recovery.go32-48
Gin 框架定义了一个 Error 结构体来表示错误。
Error 结构体包装了一个标准的 Go 错误,并带有额外的元数据和类型信息。它实现了 Go 的标准 error 接口,使其能够与标准的错误处理模式兼容。
来源:errors.go33-38 errors.go44-96
Gin 通过位标志定义了不同的错误类型
| 错误类型 | 描述 | 值 |
|---|---|---|
ErrorTypeBind | 用于请求绑定失败时 | 1 << 63 |
ErrorTypeRender | 用于响应渲染失败时 | 1 << 62 |
ErrorTypePrivate | 指示不应向客户端公开的错误 | 1 << 0 |
ErrorTypePublic | 指示可以向客户端公开的错误 | 1 << 1 |
ErrorTypeAny | 匹配任何错误类型 | 1<<64 - 1 |
您可以设置错误类型以对错误进行分类,以便后续进行过滤。
来源:errors.go15-31 errors.go45-48
Error 结构体的 Meta 字段可以存储关于错误的额外信息。
来源:errors.go50-53 errors.go56-76
Gin 的 Context 在其 Errors 字段中存储错误集合,该字段类型为 errorMsgs(一个 *Error 的切片)。
来源:context.go77-78 errors.go40
Context 上的 Error 方法允许您向请求 Context 添加错误。
您可以使用 ByType 方法按类型过滤错误。
Gin 提供了几种在发生错误时中止请求处理的方法。
| 方法 | 描述 |
|---|---|
Abort() | 停止中间件链的执行。 |
AbortWithStatus(code) | 使用指定的 HTTP 状态码中止。 |
AbortWithStatusJSON(code, obj) | 使用状态码和 JSON 响应中止。 |
AbortWithError(code, err) | 使用状态码中止并添加错误。 |
当调用 Abort() 时,Gin 会将处理程序索引设置为 abortIndex,这会阻止后续处理程序的执行。
abortIndex 定义为 math.MaxInt8 >> 1,确保一旦设置,链中的任何后续处理程序都不会被执行。
来源:context.go53 context.go184-195 context.go202-208
Gin 可以轻松地使用适当的 HTTP 状态码返回错误响应。
对于 API 响应,AbortWithStatusJSON 方法特别有用。
在使用 AbortWithError 时,错误会被添加到 Context.Errors 中,以便后续处理。
Gin 提供了一个恢复中间件,它可以捕获 panic 并将其转换为 500 Internal Server Error 响应。
您可以通过提供自己的恢复函数来定制 panic 的处理方式。
来源:recovery.go37-40 recovery.go50-104
默认的恢复行为会将 HTTP 状态码设置为 500 Internal Server Error。
使用适当的错误类型对错误进行分类。
| 错误类别 | 推荐类型 | 用例示例 |
|---|---|---|
| 验证错误 | ErrorTypeBind | 无效请求数据 |
| 系统错误 | ErrorTypePrivate | 数据库故障 |
| 用户错误 | ErrorTypePublic | 资源未找到 |
| 模板错误 | ErrorTypeRender | 模板渲染失败 |
来源: errors.go15-31
对于 JSON API,返回一致的错误结构
来源: context.go217-224 errors.go56-76
使用错误收集来实现错误处理中间件
来源: context.go242-259 errors.go125-175
Gin 的错误系统与标准的 Go 错误处理集成
来源: errors.go94-96
Gin 提供了一个灵活的错误处理系统,允许您
通过理解这些机制并遵循本文档中概述的最佳实践,您可以在 Gin 应用程序中实现健壮的错误处理。