最嚴謹的方式,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層的時候再捕獲異常並處理,這樣可以大大減少程式碼量,雖然簡單粗暴,但是易於維護。