錯誤處理

有效的錯誤處理是 Go 中穩健應用程式開發的基石,特別是在使用 GORM 與資料庫互動時。GORM 對錯誤處理的方法受到其可串接 API 的影響,需要細緻的理解。

基本錯誤處理

GORM 將錯誤處理整合到其可串接方法語法中。*gorm.DB 實例包含一個 Error 欄位,當錯誤發生時會設定此欄位。常見的做法是在執行資料庫操作後檢查此欄位,特別是在 終結方法之後。

在方法串接後,檢查 Error 欄位至關重要

if err := db.Where("name = ?", "jinzhu").First(&user).Error; err != nil {
// Handle error...
}

或者

if result := db.Where("name = ?", "jinzhu").First(&user); result.Error != nil {
// Handle error...
}

ErrRecordNotFound

當使用 FirstLastTake 等方法找不到任何記錄時,GORM 會傳回 ErrRecordNotFound

err := db.First(&user, 100).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
// Handle record not found error...
}

處理錯誤代碼

許多資料庫會傳回具有特定代碼的錯誤,這些代碼可能表示各種問題,例如約束違規、連線問題或語法錯誤。在 GORM 中處理這些錯誤代碼需要解析資料庫傳回的錯誤並擷取相關代碼

  • 範例:處理 MySQL 錯誤代碼
import (
"github.com/go-sql-driver/mysql"
"gorm.io/gorm"
)

// ...

result := db.Create(&newRecord)
if result.Error != nil {
if mysqlErr, ok := result.Error.(*mysql.MySQLError); ok {
switch mysqlErr.Number {
case 1062: // MySQL code for duplicate entry
// Handle duplicate entry
// Add cases for other specific error codes
default:
// Handle other errors
}
} else {
// Handle non-MySQL errors or unknown errors
}
}

方言轉換的錯誤

當啟用 TranslateError 時,GORM 可以傳回與所使用的資料庫方言相關的特定錯誤,GORM 會將特定於資料庫的錯誤轉換為其自己的概括錯誤。

db, err := gorm.Open(postgres.Open(postgresDSN), &gorm.Config{TranslateError: true})
  • ErrDuplicatedKey

當插入操作違反唯一約束時,會發生此錯誤

result := db.Create(&newRecord)
if errors.Is(result.Error, gorm.ErrDuplicatedKey) {
// Handle duplicated key error...
}
  • ErrForeignKeyViolated

當外來鍵約束被違反時會發生此錯誤

result := db.Create(&newRecord)
if errors.Is(result.Error, gorm.ErrForeignKeyViolated) {
// Handle foreign key violation error...
}

透過啟用 TranslateError,GORM 提供更統一的方式來處理不同資料庫的錯誤,將資料庫特定的錯誤轉換為常見的 GORM 錯誤類型。

錯誤

有關 GORM 可能回傳的完整錯誤清單,請參閱 GORM 文件中的 錯誤清單

白金贊助商

金牌贊助商

白金贊助商

金牌贊助商