如何以惯用方式处理Go语言的错误?

huangapple go评论78阅读模式
英文:

How do I do go error handling idiomatic way

问题

我有一个带有逻辑的 goroutine:

result1, err := getResult1()
result2, err := getResult2(result)
result3, err := getResult3(result2)

如果在 getResult1() 中出现错误,我不想继续执行这个 goroutine,但也不想引发 panic,因为它会破坏主程序。我已经用一种糟糕的方式实现了它,但有没有更符合惯用方式的解决方案呢?

英文:

I have a goroutine with logic:

result1, err := getResult1()
result2, err := getResult2(result)
result3, err := getResult3(result2)

If I have an error in getResult1(), I would not like to continue this goroutine at all, but no panic, because it destroy the main too. I've implemented it in an awful way, but what would be the idiomatic solution?

答案1

得分: 3

习惯用法是做某事

r, err := get()
if err != nil {
    // 处理错误
    // 不要继续执行
}


你可以将错误返回给调用者,由调用者决定如何处理。

你不需要恐慌。你可以只是记录日志。

或者在某个循环中使用错误进行重试。

英文:

The idiomátic way is do something

r, err := get()
if err != nil {
    // do something with err
    // do not continue
}


You can return the error to the caller, and the caller decide what to do.

You don’t need to panic. You can just log.

Or use the error in some loop to retry

答案2

得分: 3

在golang中,最好在错误发生时立即处理错误。

result1, err := getResult1()
if err != nil {
// 记录错误并返回
return err
}
result2, err := getResult2(result)
result3, err := getResult3(result2)

如果你需要处理 panic 并重新控制 panic 的 goroutine,那么可以使用 recover():

defer func() {
if r := recover(); r != nil {
fmt.Println("恢复我的 panic goroutine", r)
}
}()

英文:

In golang it's better to handle errors as soon as they occur

result1, err := getResult1()
if err != nil {
    // log your error and return
    return err
}
result2, err := getResult2(result)
result3, err := getResult3(result2)

If you need to handle panics and regain control over panicking goroutine, then recover() is your way to go:

 defer func() {
    if r := recover(); r != nil {
        fmt.Println("Recovering my panicing goroutine", r)
    }
}()

huangapple
  • 本文由 发表于 2022年4月11日 03:47:15
  • 转载请务必保留本文链接:https://go.coder-hub.com/71820030.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定