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