Golang之错误处理
生活随笔
收集整理的這篇文章主要介紹了
Golang之错误处理
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、錯(cuò)誤只在邏輯的最外層處理一次,底層只返回錯(cuò)誤。
2、底層除了返回錯(cuò)誤外,要對原始錯(cuò)誤進(jìn)行包裝,增加錯(cuò)誤信息、調(diào)用棧等這些有利于排查的上下文信息。
1、errors包:
//只附加新的信息 func?WithMessage(err?error,?message?string)?error 如: if err != nil {errors.WithMessage(err, "could not read config") }//只附加調(diào)用堆棧信息 func?WithStack(err?error)?error//同時(shí)附加堆棧和信息 func?Wrap(err?error,?message?string)?error 如: if err != nil {return errors.Wrap(err, "open failed") }// 返回包裝錯(cuò)誤對應(yīng)的最原始錯(cuò)誤 errors.Cause(err) 如: fmt.Printf("original error: %T %v\n", errors.Cause(err), errors.Cause(err))2、Err集中判斷:
初始: // 開車去商店 shopper, err := shopper.Drive(FuelNeededToGetToStore) if nil != err {log.Fatalf("could not complete shopping: %s", err) } // 買雞蛋 shopper, err = shopper.BuyEggs(EggsRequired) if nil != err {log.Fatalf("could not complete shopping: %s", err) } // 買完雞蛋開車回家 shopper, err = shopper.Drive(FuelNeededToGetHome) if nil != err {log.Fatalf("could not complete shopping: %s", err) }只打印不返回的err集中判斷 func main(){shopper, err := shopper.Drive(FuelNeededToGetToStore)FatalIfErrNotNil(err)shopper, err = shopper.BuyEggs(EggsRequired)FatalIfErrNotNil(err)shopper, err = shopper.Drive(FuelNeededToGetHome)FatalIfErrNotNil(err) } func FatalIfErrNotNil(err error) {if nil != err {log.Fatalf("could not complete shopping: %s", err)} }3、責(zé)任鏈迭代變換
func main(){driveToStore := Flavorize(Drive, FuelNeededToGetToStore)buyEggs := Flavorize(BuyEggs, EggsRequired)driveHome := Flavorize(Drive, FuelNeededToGetHome)shopper, err := ProcessSteps(shopper,driveToStore,buyEggs,driveHome,)if nil != err {log.Fatalf("could not complete shopping: %s", err)} }func ProcessSteps(s Shopper, steps ...func(Shopper) (Shopper, error)) (Shopper, error) {for _, step := range steps {var err error s, err = step(s)if nil != err {return s, err}}return s, nil }func Flavorize(f func(Shopper, int) (Shopper, error), arg int) func(Shopper) (Shopper, error) {return func(s Shopper) (Shopper, error) {return f(s, arg)} }4、使用defer消除冗余
func writeConfig(data interface{}) (err error) {defer func() {if err != nil {err = errors.WithMessage(err, "writing configuration")}}()b, err := json.Marshal(data)if err != nil {return err}if err = ioutil.WriteFile("config.json", b, 0644); err != nil {return err}return }5、
總結(jié)
以上是生活随笔為你收集整理的Golang之错误处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端18个月难度翻番?来这里把握大前端技
- 下一篇: 2019沙雕失误瞬间!哈哈哈哈笑出猪叫.