package main
import (
"errors"
"fmt"
)
// 定义自定义错误类型
type DatabaseError struct {
ErrMsg string
}
func (de DatabaseError) Error() string {
return de.ErrMsg
}
// 模拟数据库操作的函数
func ConnectDatabase() error {
// 这里模拟数据库连接失败的情况
success := false
if!success {
return DatabaseError{ErrMsg: "数据库连接失败"}
}
return nil
}
func main() {
err := ConnectDatabase()
if err != nil {
var dbErr DatabaseError
if errors.As(err, &dbErr) {
fmt.Printf("自定义数据库错误: %v\n", dbErr)
} else {
fmt.Printf("其他错误: %v\n", err)
}
// 使用fmt.Errorf包装错误
newErr := fmt.Errorf("操作数据库时发生错误: %w", err)
fmt.Printf("包装后的错误: %v\n", newErr)
// 使用errors.Is判断错误类型
if errors.Is(newErr, DatabaseError{}) {
fmt.Println("这是一个数据库相关的错误")
}
}
}
- 定义自定义错误类型:
- 首先定义一个结构体
DatabaseError
,用于表示数据库操作相关的错误。
- 为该结构体实现
error
接口的Error
方法,返回错误信息字符串。
- 在函数中返回自定义错误:
ConnectDatabase
函数模拟数据库连接操作,如果连接失败(这里简单通过success
变量模拟),返回DatabaseError
类型的错误。
- 错误判断和处理:
- 在
main
函数中调用ConnectDatabase
函数,并获取其返回的错误。
- 使用
errors.As
函数判断错误是否为DatabaseError
类型,如果是则进行相应处理。
- 使用
fmt.Errorf
函数对错误进行包装,添加更详细的上下文信息。
- 使用
errors.Is
函数判断包装后的错误是否与DatabaseError
类型相关。