第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

從函數(shù)和調(diào)用者到終端的 Golang 錯誤處理

從函數(shù)和調(diào)用者到終端的 Golang 錯誤處理

Go
慕斯王 2023-04-17 14:50:12
我想問一下錯誤處理的最佳實踐,假設(shè)我有以下讀取文件解析它的函數(shù),當(dāng)找不到文件并且解組失敗時,它可能返回兩種類型的錯誤func Parse(source string) (bma.Bma, error) {    file, err := ioutil.ReadFile(source + "bma.yaml")    m := bma.Bma{}    if err != nil {        logs.Error("Not able to read the bma file")        return m, err    }    err = yaml.Unmarshal([]byte(file), &m)    if err != nil {        logs.Error("Not able to unmarshal the bma file ")        return m, err    }    return m, err}現(xiàn)在如果我調(diào)用這個函數(shù)并且有錯誤我也打印這個錯誤,該程序是 CLI 程序所以我認為如果出現(xiàn)問題會打印太多錯誤,可以嗎,或者有更好的方法嗎?bma ,err := Parse("path")    if err != nil {        logs.Error("Error while parsing ")        return m, err    }
查看完整描述

2 回答

?
溫溫醬

TA貢獻1752條經(jīng)驗 獲得超4個贊

我認為您要問的更多是關(guān)于何時打印錯誤,而不是何時處理或不處理錯誤。就我而言,如果我認為它們將來對我有用,我喜歡打印所有可以打印的日志。


在您的情況下,消息可能logs.Error("Error while parsing ")過于冗長,因為您沒有在那里顯示任何詳細信息。


您可以考慮的其他方法是將您的自定義錯誤返回到頂層函數(shù)而不是更深層次的函數(shù),并且只在那里顯示日志消息。在示例的情況下應(yīng)該是這樣的:


func main() {

    bma, err := Parse("path")

    if err != nil {

        log.Println(err)

        return

    }

}


func Parse(source string) (bma.Bma, error) {

    file, err := ioutil.ReadFile(source + "bma.yaml")

    m := bma.Bma{}

    if err != nil {

        return m, fmt.Errorf("Not able to read the bma file: %s", err.Error())

    }

    err = yaml.Unmarshal([]byte(file), &m)

    if err != nil {

        return m, fmt.Errorf("Not able to unmarshal the bma file: %s", err.Error())

    }

    return m, err

}


查看完整回答
反對 回復(fù) 2023-04-17
?
弒天下

TA貢獻1818條經(jīng)驗 獲得超8個贊

package main


import (

    "fmt"

    "log"

    "os"

)


func main() {

    fileName := "main.go"

    err := parse(fileName)

    if err != nil {

        log.Println(err)

    }

    log.Println(parse2(fileName))

    log.Println(parse3(fileName))

    //Incase of library one need to create new errors and export them

    //see error.go file of some stdlib packages for some example

}


func parse(s string) error {

    _, err := os.Open(s + "t") // fails

    if err != nil {

        // no need to add any custom err information,

        // as err contains required details (action, fileName, error)

        return err

    }

    return nil

}


func parse2(s string) error {

    // Incase you must handle errors

    _, err := os.Open(s + "t") // fails

    if err != nil {


        err = (err.(*os.PathError)).Err //only, if you must handle it


        if err == os.ErrPermission {

            //send notification to developer, about user

        } else if err == os.ErrNotExist {

            //user is so irresponsible, block him

        } else if os.IsNotExist(err) {

            fmt.Println("found the cause")

        }

        return err


    }

    return nil

}


func parse3(s string) error {

    err := badError(s)

    if err != nil {

        // wrap error with required context information,

        // if err doesn't return proper error

        // or if you have more useful information

        return fmt.Errorf("%s ,%s", s, err)

    }

    return nil

}


func badError(s string) error {

    return fmt.Errorf("badError,I'm not saying why it failed, and what's the argument which caused me to fail, and making error without actually any content")

}


查看完整回答
反對 回復(fù) 2023-04-17
  • 2 回答
  • 0 關(guān)注
  • 126 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號