英文:
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)
}
}()
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论