【问题标题】:How to return the errors in golang?如何返回golang中的错误?
【发布时间】:2021-12-11 21:20:44
【问题描述】:

在这段代码中,我从环境变量中获取数据并使用它将电子邮件发送到给定地址。只有当我从代码中排除错误时它才有效。我返回错误并在中间件中使用它们,因为我不想每次都使用log.Fatal(err)。但它给了我两个错误。

1.不能在返回语句中使用“”(无类型字符串常量)作为[4]字符串值

2。代码无法执行无法到达的返回语句

func LoadEnvVariable(key string) (string, error) {
    viper.SetConfigFile(".env")
    err := viper.ReadInConfig()
    return "", err

    value, ok := viper.Get(key).(string)
    if !ok {
        return "", err
    }
    return value, nil
}

func Email(value [4]string) ([4]string, error) {
    mail := gomail.NewMessage()

    myEmail, err := LoadEnvVariable("EMAIL")
    return "", err
    appPassword, err := LoadEnvVariable("APP_PASSWORD")
    return "", err

    mail.SetHeader("From", myEmail)
    mail.SetHeader("To", myEmail)
    mail.SetHeader("Reply-To", value[1])
    mail.SetHeader("subject", value[2])
    mail.SetBody("text/plain", value[3])

    a := gomail.NewDialer("smtp.gmail.com", 587, myEmail, appPassword)
    err = a.DialAndSend(mail)
    return "", err

    return value, nil
}

【问题讨论】:

  • 您的代码无条件返回。检查是否存在错误:if err!=nil { return "", err} 或对于 [4] 字符串情况,{return nil,err}
  • @BurakSerdar nil 适用于切片,但不适用于固定大小的数组类型:play.golang.org/p/yb7QRp1A9CV

标签: go error-handling return


【解决方案1】:

用它来检查错误

   if err != nil {  
       return "", err 
    }

func LoadEnvVariable(key string) (string, error) {
        viper.SetConfigFile(".env")
        err := viper.ReadInConfig()
        if err != nil {
            return "", err
        }
    
        value, ok := viper.Get(key).(string)
        if !ok {
            return "", err
        }
        return value, nil
    }
    
    func Email(value [4]string) ([4]string, error) {
        mail := gomail.NewMessage()
    
        myEmail, err := LoadEnvVariable("EMAIL")
        if err != nil {
            return "", err
        }
    
        appPassword, err := LoadEnvVariable("APP_PASSWORD")
        if err != nil {
            return "", err
        }
    
        mail.SetHeader("From", myEmail)
        mail.SetHeader("To", myEmail)
        mail.SetHeader("Reply-To", value[1])
        mail.SetHeader("subject", value[2])
        mail.SetBody("text/plain", value[3])
    
        a := gomail.NewDialer("smtp.gmail.com", 587, myEmail, appPassword)
        err = a.DialAndSend(mail)
        if err != nil {
            return "", err
        }
    
        return value, nil
    }

【讨论】:

  • 如果我想删除if err != nil {} 并只使用return err 怎么办?我在中间件中使用了 log.Fatal
【解决方案2】:

首先,错误处理,在返回之前检查err是否为nil!

所以不是:

myEmail, err := LoadEnvVariable("EMAIL")
return "", err

而是:

myEmail, err := LoadEnvVariable("EMAIL")
if err != nil {
    return "", err
}

其次,单个字符串类型""[4]string 的固定数组大小兼容。使用命名返回变量可能会让您的生活更轻松,因此您无需在发生错误时传递显式的“零”值。所以像这样定义你的函数签名:

func Email(in [4]string) (out [4]string, err error) {

    myEmail, err := LoadEnvVariable("EMAIL")
    if err != nil {
        return // implicitly returns 'out' and 'err'
    }

    // ...

    out = in
    return  // implicitly returns 'out' and nil 'err'
}

【讨论】:

  • 如果我想删除if err != nil {} 并只使用return err 怎么办?我在中间件中使用了 log.Fatal
  • 这将提前返回函数——即使err == nil(即没有错误)。所以这绝对不是你想要的。
  • 我只想让if err != nil {log.Fatal()} 使用一次,以便我可以打电话。在您提供的代码中,我还写了if err != nil {}。有没有其他办法?
猜你喜欢
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 2014-04-20
  • 2019-04-26
相关资源
最近更新 更多