什么是正确的golang方式来做到这一点:

时间:2014-07-25 05:37:36

标签: go

这看起来有点愚蠢,肯定有更好的方法吗?

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 ...

5 个答案:

答案 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提供了将错误包装到记录错误发生位置的另一个错误的功能。

dropbox/godropbox/errors/errors.go

中的功能相同

答案 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的答案。