Как собрать как можно больше информации, прежде чем возвращать ошибку - PullRequest
0 голосов
/ 01 мая 2020
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, где, когда приходит / о запросе, я перенаправляю на эту функцию. Я пытаюсь получить информацию, связанную с системой. Я хочу собрать как можно больше информации и вернуть ошибку в прошлом. Например, если память возвращает ошибку, вместо прямой ошибки я хочу набрать go перед кодом и получить всю информацию. Застрял на том, как это сделать.

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Вам не нужно возвращать ошибку сразу, просто проверьте все ошибки в прошлом и верните пользовательскую ошибку, или вы можете вернуть последнюю ошибку, как указано @ Mar c

 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)
}
1 голос
/ 01 мая 2020

Одно простое решение для нефатальных ошибок (ie: ошибки, при которых можно продолжить) - это сохранить последнюю ненулевую ошибку.

Например:

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)
  • часть ошибок (добавляйте к ней для каждой не-нулевой ошибки)
  • более структурированная: сохраните ошибку вместе с данными, которые вы возвращаете. ie: иметь поле about.Errors []error или даже одно для каждой операции: about.Errors map[string]error и сохранять каждую ошибку: about.Errors["memory"] = errFromMemoryLookup

Если вы хотите знать об ошибках наряду с актуальной информацией, вам, вероятно, go с последним.

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