为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
人到中年有点甜 2022-06-01 16:01:43
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 请求到来时,我将重定向到这个函数。我正在尝试获取一些与系统相关的信息。我想要做的是,我想收集尽可能多的信息并在最后返回错误。例如,如果内存返回错误,而不是直接返回错误,我想先执行代码并获取所有信息。坚持如何做到这一点。
查看完整描述

2 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

您不需要立即返回错误,只需检查最后的所有错误并返回自定义错误,或者您可以返回 @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)

}


查看完整回答
反对 回复 2022-06-01
?
郎朗坤

TA贡献1921条经验 获得超9个赞

非致命错误的一种简单解决方案(即:可以继续的错误)是保存最后一个非零错误。


例如:


var lastErr err

mem, 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

如果您想了解错误以及实际信息,您可能应该使用最后一个。


查看完整回答
反对 回复 2022-06-01
  • 2 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号