首页 文章

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

提问于
浏览
5

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

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 回答

  • 2

    可悲的是,这就是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
        }
    }
    
  • 4

    我不会只是打印错误而不返回任何内容:想法是对错误采取行动并将其返回(如果没有采取果断行动,就像一个简单的日志) .
    简单地调用 return 就像完全忽略错误一样,就应用程序的其余部分而言 .

    请参阅“Best Practices for Errors in Go”,其中包含以下建议:

    预定义错误

    鉴于一小部分错误,处理此问题的最佳方法是在包级别公开预定义每个错误 .

    提供信息

    自定义错误类型是解决此问题的最佳方法 . Go的隐式接口使创建简单

    提供堆栈跟踪

    package errgo提供将错误包装到另一个错误中的功能,该错误记录错误发生的位置 .

    (您在dropbox/godropbox/errors/errors.go中具有相同的功能)

  • 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)
        }
    }
    
  • 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))
    }
    

    通常,显式处理是可行的方法,但根据上下文,您可以执行各种操作 .

  • 2

    冒着把它变成代码高尔夫的风险,Go支持带有赋值的单行if语句:

    if err := SendMessageAndWait(db, "this is a test"); err != nil {
        return err
    }
    

    缺点是分配的所有返回值都限定在相应的 if / else if / else 块中,因此如果您在该块之外实际需要不同的返回值,则必须更接近PeterSO的答案 .

相关问题