亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 中更簡潔的錯誤處理

Go 中更簡潔的錯誤處理

Go
MMTTMM 2021-09-13 16:07:16
如何處理 Go 中的大量錯誤?我查看了我的代碼,發現它充滿了錯誤處理程序:err = result.Scan(&bot.BID, &bot.LANGUAGE, &bot.SOURCE)if err != nil {    log.Fatalf("result.Scan: %v", err)    return}fileName, err := copySourceToTemporaryFile(bot)if err != nil {    log.Fatalf("copySourceToTemporaryFile: %v", err)    return}...很多行看起來像:// do something// handle error// handle error// handle error// do something 2// handle error// handle error// handle error我可以創建一個打印錯誤并停止處理的默認處理程序,或者至少將這個“錯誤處理程序垃圾”移出我的代碼邏輯嗎?
查看完整描述

2 回答

?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

這讓我想起了 Rob Pike最近的Errors are values,以及Rob Pike 先生在 GoCon 2014 上教我關于 Go 中錯誤處理的實踐


然而,關鍵的教訓是錯誤是值,Go 編程語言的全部功能可用于處理它們。


值得強調的是,無論設計如何,程序檢查錯誤(無論它們是否暴露)都是至關重要的。這里的討論不是關于如何避免檢查錯誤,而是關于使用語言來優雅地處理錯誤。


一種技術是定義一個名為 an 的對象errWriter:


type errWriter struct {

    w   io.Writer

    err error

}

該write方法調用底層的Write方法Writer并記錄第一個錯誤以備后用:


func (ew *errWriter) write(buf []byte) {

    if ew.err != nil {

        return

    }

    _, ew.err = ew.w.Write(buf)

}

一旦發生錯誤,該write方法就會變為空操作,但error會保存該值。


給定errWriter類型及其寫入方法,上面的代碼可以重構:


ew := &errWriter{w: fd}

ew.write(p0[a:b])

ew.write(p1[c:d])

ew.write(p2[e:f])

// and so on

if ew.err != nil {

    return ew.err

}


查看完整回答
反對 回復 2021-09-13
  • 2 回答
  • 0 關注
  • 211 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號