Как обрабатывать ошибки в отложенных утверждениях - PullRequest
2 голосов
/ 23 апреля 2020

Итак, у меня есть это:

defer res.Body.Close()

проблема в том, что этот вызов может потенциально вернуть ненулевую ошибку. Поэтому я предполагаю, что единственный способ правильно зафиксировать ошибку - это

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

. Есть ли другой способ?

1 Ответ

1 голос
/ 26 апреля 2020

Вы не можете сделать это заявление err: = defer res.Body.Close () Вот так. Поэтому это утверждение неверно. Следующее является допустимым.

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

Кроме того, есть другой способ обработки ошибок в операторах отсрочки следующим образом:

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

С помощью приведенного выше кода, когда есть ошибка, код вернет ошибку, в противном случае он закроет res. Когда веселье c вернется в откладывание.

Вы можете посетить https://blog.learngoprogramming.com/5-gotchas-of-defer-in-go-golang-part-iii-36a1ab3d6ef1 для получения дополнительной информации об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...