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

Http 如何在返回错误之前收集尽可能多的信息,http,go,Http,Go,这是我的http端点之一,当/about请求到来时,我将重定向到此函数。我正在尝试获取一些与系统相关的信息。我想做的是,我想收集尽可能多的信息,并在最后返回错误。例如,如果内存返回错误,我不想直接返回错误,而是想在代码前面获取所有信息。关于如何做到这一点,我一直在思考。对于非致命错误(即:可以继续的错误),一个简单的解决方案是保存最后一个非零错误 例如: func About(c echo.Context) error { about := newInfo() m

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

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

例如:

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)

}
在函数末尾,根据需要返回
lastErr

该主题的其他变体包括:

  • firstErr
    (如果不是
    nil,则不要覆盖)
  • 错误片段(针对每个非零错误追加)
  • 更结构化:将错误与返回的数据一起保存。ie:有一个
    about.Errors[]error
    字段,甚至每个操作都有一个:
    about.Errors映射[string]error
    并保存每个错误:
    about.Errors[“memory”]=errFromMemoryLookup

如果您想了解实际信息中的错误,您可能需要了解最后一个错误。

您不需要立即返回错误,只需检查最后一个中的所有错误并返回自定义错误,或者您可以返回@Marc提到的最后一个错误

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
}

你能用一个例子来解释第三个吗。您选择哪一个取决于您想要/需要的详细信息量。请注意,某些第三方Go包返回一个
错误
接口值,其底层具体类型为或包含
[]错误
,这使简单调用方可以执行通常的
ret,err:=f();如果出错!=nil{…}
thing,但也允许花哨的调用者执行
ret,err:=f();如果出错!=nil{if fancy,ok:=err.(复合错误);ok{…专门处理复合错误…}…}
 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)
}