最严谨的方式,Always检查error,并做相应的处理
项目结构:
代码:
common.go:
package common import ( "github.com/pkg/errors" ) func Functest(a int64, b int64) (c int64, err error) { if a < 0 || b < 0 { return c, errors.New("a or b is invalid") } c = a * b return c, err }
godep_common.go
package main import ( "fmt" "os" "strconv" "github.com/junneyang/letsgo/common" "github.com/pkg/errors" ) func FuncTestWrap() (c int64, err error) { a, err := strconv.ParseInt(os.Getenv("VAR_A"), 10, 64) if err != nil { return c, errors.Wrap(err, "VAR_A ParseInt Fail") } b, err := strconv.ParseInt(os.Getenv("VAR_B"), 10, 64) if err != nil { return c, errors.Wrap(err, "VAR_B ParseInt Fail") } c, err = common.Functest(a, b) return c, errors.Wrap(err, "FuncTestWrap Fail") } func main() { c, err := FuncTestWrap() fmt.Println(c, err) }
是的,就是这么蛋疼,
所有的error不能忽略,需要检查,导致代码比较冗长。
这种办法代码非常严谨,也是Golang官方期望的方式。Golang的标准库代码也是这么写的。非常严谨。
但是很多时候其实并不想关注error,只是希望像Java/Python一样有异常直接自动抛出,谁关注异常的时候再进行检查、处理。
尤其是在业务代码的架构层次较多的时候比如常见的Web应用,最佳实践是底层只管抛出异常,到Web层的时候再捕获异常并处理,这样可以大大减少代码量,虽然简单粗暴,但是易于维护。