如何在返回错误之前收集尽可能多的信息

func About(c echo.Context) error {

        about := newInfo()

        memory, err := getMemory()

        if err != nil {

                log.Errorf("Failed to get memory %v", err)

                return err

        }

        about.SystemInfo["memory"] = memory


        version, err := getVersion()

        if err != nil {

                log.Errorf("Failed to get version details %v", err)

                return err

        }


        about.Version = version

        serialNo ,err= getSerialInfo()

        if err != nil{

                log.Errorf("Failed to get Product code %v", err)

                return err

        }

        about.SerialNo = serialNo

        network, err := localAddress()

        if err != nil {

                log.Errorf("Failed to get Network details %v", err)

                return err

        }

        about.Network = network


        return c.JSON(http.StatusOK, about)


}

这是我的一个 http 端点,当 /about 请求到来时,我将重定向到这个函数。我正在尝试获取一些与系统相关的信息。我想要做的是,我想收集尽可能多的信息并在最后返回错误。例如,如果内存返回错误,而不是直接返回错误,我想先执行代码并获取所有信息。坚持如何做到这一点。


人到中年有点甜
浏览 134回答 2
2回答

慕田峪7331174

您不需要立即返回错误,只需检查最后的所有错误并返回自定义错误,或者您可以返回 @Marc 提到的最后一个错误 func About(c echo.Context) error {        about := newInfo()        memory, errMemory := getMemory()        if errMemory != nil {                log.Errorf("Failed to get memory %v", errMemory)        } else {          about.SystemInfo["memory"] = memory        }        version, errVersion := getVersion()        if errVersion != nil {                log.Errorf("Failed to get version details %v", errVersion)        } else {          about.Version = version        }        serialNo ,errSerial= getSerialInfo()        if errSerial != nil{                log.Errorf("Failed to get Product code %v", errSerial)        } else {          about.SerialNo = serialNo        }        network, errNet := localAddress()        if errNet != nil {                log.Errorf("Failed to get Network details %v", errNet)        } else {          about.Network = network        }        if errNet != nil || errSerial != nil || errVersion != nil || errMemory != nil  {          // return a custom error, here        }        return c.JSON(http.StatusOK, about)}

郎朗坤

非致命错误的一种简单解决方案(即:可以继续的错误)是保存最后一个非零错误。例如:var lastErr errmem, err := ....if err != nil {  // Overwrite lastErr only if an error was encountered.  lastErr = err}version, err := ...if err != nil {  lastErr = err}在函数结束时,随意返回lastErr。该主题的其他变体包括:firstErr(如果不是,请不要覆盖nil)一片错误(为每个非零错误附加到它)更结构化:将错误与您返回的数据一起保存。即:有一个about.Errors []error字段,甚至每个操作都有一个字段:about.Errors map[string]error并保存每个错误:about.Errors["memory"] = errFromMemoryLookup如果您想了解错误以及实际信息,您可能应该使用最后一个。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go