首页 > 解决方案 > 如何处理 defer 语句中的错误

问题描述

所以我有这个:

defer res.Body.Close()

问题是这个调用可能会返回一个非零错误。所以我认为正确捕获错误的唯一方法是使用这个

defer func(){
  if err := defer res.Body.Close(); err !=nil {
     log.Error(err);
  }
}()

还有其他方法吗?

标签: go

解决方案


你真的不能 err: = defer res.Body.Close ()像这样做出这样的声明。因此这个说法是无效的。以下是有效的。

defer func(){
  if err := res.Body.Close(); err !=nil {
     log.Error(err);
  }
}()

此外,还有另一种处理 defer 语句中的错误的方法,如下所示。

func do() error {
  res, err := http.Get("http://notexists")
  if res != nil {
    defer res.Body.Close()
  }
  if err != nil {
    return err
  }
  // ..code...
  return nil
}

上面的代码,当有错误时,代码会返回错误,否则会在函数defer返回时关闭res.Body。

您可以访问https://blog.learngoprogramming.com/5-gotchas-of-defer-in-go-golang-part-iii-36a1ab3d6ef1了解更多信息。


推荐阅读