gpt4 book ai didi

go - 处理多个错误

转载 作者:IT王子 更新时间:2023-10-29 00:42:18 25 4
gpt4 key购买 nike

我有函数 1:

func Function1() {
if err := Function2(); err != nil {

}
}

和功能2:

func Function2() error {
if err := doSomethingThatMightCauseError(); err != nil {
return errors.New("Error Type 1")
}

if err := doSomethingElseThatMightCauseError(); err != nil {
return errors.New("Error Type 2")
}
}

我如何检测发生了什么类型的错误(内部错误、数据库中未找到结果等),然后在函数 1 中进行相应处理?

最佳答案

您有 3 个主要选项:

  1. 基于字符串,即查看消息。这当然很糟糕,因为如果您稍后更改消息中的一个字母,您需要重写所有检查代码,所以我会避免它。

  2. 如果错误消息可以保持不变,只需将错误创建为全局变量,然后将收到的错误与已知的预定义错误进行比较。

例如:

var ErrDB = errors.New("Database Error")
var ErrTimeout = errors.New("Timeout") //or whatever

然后

if err := someFunc(); err != nil {
switch err {
case ErrDB:
//do stuff that needs to be done here
case ErrTimeout:
//etc /etc
}
}
  1. 创建一个自定义错误类型,因为错误只是接口(interface),可以有一些标识符或其他上下文数据。

例如:

const (
ErrDB = 1
ErrTimeout = 2
...
)

type MyError struct {
Code int
Message string
}

// This is what you need to be an error
func (e MyError)Error() string {
return e.Message
}


func NewError(s string, code int) error {
return MyError{s,code}
}

然后当你返回它时做这样的事情:

// Return a MyError with a DB code for db operations
func someFunc() error {
if err := talkToDB(); err != nil {
return NewError(err.Error(), ErrDB)
}
return nil
}

分析时:

if err := someFunc(); err != nil {

// check if this is a MyError
if me, ok := err.(MyError); ok {
// now we can check the code
switch me.Code {
case ErrDB:
//handle this
....
}
}
}

关于go - 处理多个错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30381233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com