这看起来有点愚蠢,肯定有更好的方法吗?
err = SendMessageAndWait(db, "this is a test")
if err != nil {
fmt.Println("Error sending message", err)
return
}
err = DoSomething(db, "this is a test")
if err != nil {
fmt.Println("Error sending message", err)
return
}
err = CheckSomething(db, "this is another test")
if err != nil {
fmt.Println("Error sending message", err)
return
}
err = SendMessageAndWait(db, "this is a third test")
if err != nil {
fmt.Println("Error sending message", err)
return
}
... x10 ...
答案 0 :(得分:5)
可悲的是,这就是Go的方式,但是在某种程度上你可以让它更清洁:
func isError(err error, pre string) error {
if err != nil {
log.Printf("%v: %v", pre, err)
}
return err
}
func isErrorBool(err error, pre string) (b bool) {
if err != nil {
log.Printf("%v: %v", pre, err)
b = true
}
return
}
func checkSomething() error {
return nil
}
func main() {
if err := isError(checkSomething(), "something failed"); err != nil {
return /* err */
}
//if you don't want to return the error, just check it and die.
if isErrorBool(checkSomething(), "something else failed") {
return
}
}
答案 1 :(得分:2)
我不会只是打印错误而不返回任何内容:想法是对错误采取行动并返回它(如果没有采取果断行动,就像一个简单的日志)。
简单地调用return
就像在应用程序的其余部分方面完全忽略错误一样。
请参阅“Best Practices for Errors in Go”,其中包含以下建议:
鉴于一小部分错误,处理此错误的最佳方法是在包级别公开预定义每个错误。
自定义错误类型是解决此问题的最佳方法。 Go的隐式接口使创建一个简单的
中的功能相同package errgo提供了将错误包装到记录错误发生位置的另一个错误的功能。
答案 2 :(得分:2)
在Go中,始终检查错误。例如,
package main
import "fmt"
func doStuff() error {
err := SendMessageAndWait(db, "this is a test")
if err != nil {
return err
}
err = DoSomething(db, "this is a test")
if err != nil {
return err
}
err = CheckSomething(db, "this is another test")
if err != nil {
return err
}
err = SendMessageAndWait(db, "this is a third test")
if err != nil {
return err
}
return nil
}
func main() {
err := doStuff()
if err != nil {
fmt.Println("Error sending message", err)
}
}
答案 3 :(得分:2)
鉴于你缺乏背景,我只能假设你从func main()
返回。
http://play.golang.org/p/pgcwMb647A
package main
import (
"fmt"
"log"
"errors"
)
func foo(x int) error {
if x == 3 {
return errors.New("x == 3")
}
fmt.Println(x)
return nil
}
func main() {
check := func(err error) {
if err != nil {
log.Fatal(err)
}
}
check(foo(1))
check(foo(2))
check(foo(3))
check(foo(4))
}
一般来说,明确处理是可行的方法,但根据具体情况,您可以做各种各样的事情。
答案 4 :(得分:2)
冒着将其变为代码高尔夫的风险,Go支持带有赋值的单行if语句:
if err := SendMessageAndWait(db, "this is a test"); err != nil {
return err
}
缺点是分配的所有返回值都限定在相应的if
/ else if
/ else
块中,因此如果您确实需要在该块之外使用不同的返回值,那么接近PeterSO的答案。