全部学科
Python全栈
python
NodeJS全栈
nodejs
📅 2026-05-21 6 分钟 ✍️ juanwangdev

GORM 错误类型识别

GORM 返回标准错误类型,使用 errors.Is 可准确判断错误类型,本文介绍常见 GORM 错误与处理方法。

GORM 错误常量

GORM 定义了一系列错误常量:

Go
import "gorm.io/gorm"

// 常见错误
gorm.ErrRecordNotFound      // 记录未找到
gorm.ErrInvalidTransaction  // 无效事务
gorm.ErrDryRunModeUnsupported // 不支持 DryRun
gorm.ErrMissingWhereClause  // 缺少 WHERE 条件
gorm.ErrUnsupportedRelation // 不支持的关联关系

错误类型识别

使用 errors.Is 判断错误类型:

Go
import (
    "errors"
    "gorm.io/gorm"
)

var user User
err := db.First(&user, 1).Error

if errors.Is(err, gorm.ErrRecordNotFound) {
    fmt.Println("记录未找到")
} else if err != nil {
    fmt.Printf("其他错误: %v\n", err)
}

常见使用场景

Go
// 场景1: 查询记录
err := db.Where("email = ?", email).First(&user).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
    return nil, fmt.Errorf("用户不存在")
}

// 场景2: 更新记录
err := db.Model(&User{}).Where("id = ?", id).Update("name", name).Error
if errors.Is(err, gorm.ErrMissingWhereClause) {
    return fmt.Errorf("缺少 WHERE 条件")
}

错误处理对照

错误类型触发场景处理建议
ErrRecordNotFoundFirst/Take/Last 未找到记录返回 404 或创建新记录
ErrInvalidTransaction事务未开始或已提交检查事务状态
ErrMissingWhereClauseDelete/Update 缺少 WHERE补充条件或使用 Unscoped
ErrCheckConstraintViolated约束检查失败检查数据完整性

不要使用字符串匹配判断错误,始终使用 errors.Is

要点总结

  • GORM 定义标准错误常量如 ErrRecordNotFound
  • 使用 errors.Is(err, gorm.ErrXxx) 判断错误类型
  • 不要字符串匹配,使用标准库 errors.Is
  • 根据错误类型采取不同处理策略

文章存放路径:D:\git2\jwdev\articles\GORM\进阶\错误处理与日志\错误类型识别.md

想在手机上练习这篇文章的配套题目?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一篇 GORM 查询钩子实现
下一篇 → GORM 数据库错误处理
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码