返回并处理错误

处理错误是可靠代码的基本特征。在本节中,您将添加一些代码来从 greetings 模块返回错误,然后在调用者中处理它.

  1. 在 greetings/greetings.go 中,添加下面突出显示的代码.

    如果您不知道该问候谁,那么发送问候是没有意义的。如果名称为空,则向调用方返回错误。将以下代码复制到 greetings.go 中并保存该文件.

    package greetings
    
    import (
        "errors"
        "fmt"
    )
    
    // Hello 为指定的人返回问候语.
    func Hello(name string) (string, error) {
        // 如果没有给出名字,返回一个带有消息的错误.
        if name == "" {
            return "", errors.New("empty name")
        }
    
        // 如果接收到名称,则返回一个嵌入名称的值
        // 在问候消息中.
        message := fmt.Sprintf("Hi, %v. Welcome!", name)
        return message, nil
    }
    

    在此代码中,您:

    • 更改该函数,使其返回两个值:string 和 一个 error。您的调用方将检查第二个值以查看是否发生错误。(任何 Go 函数都可以返回多个值。有关详细信息,请参阅 Effective Go.)
    • 导入 Go 标准库 errors 包 以便您可以使用其 errors.New 函数.
    • 添加 if 语句以检查无效请求(名称为空的字符串),如果请求无效,则返回错误。errors.New函数返回一个error,其中包含您的消息。
    • 在成功返回时添加 nil(表示无错误)作为第二个值。这样,调用方可以看到函数是否成功。
  2. 在 hello/hello.go 文件中,处理错误现在由 Hello 函数返回 ,包括非错误值。

    将以下代码粘贴到 hello.go 中.

    package main
    
    import (
        "fmt"
        "log"
    
        "example.com/greetings"
    )
    
    func main() {
        // 设置预定义Logger的属性,包括
        // 日志条目前缀和禁用打印的标志
        //  时间、源文件和行号.
        log.SetPrefix("greetings: ")
        log.SetFlags(0)
    
        //  请求问候消息.
        message, err := greetings.Hello("")
        // 如果返回错误,则将其打印到控制台并
        // 退出程序.
        if err != nil {
            log.Fatal(err)
        }
    
        // 如果没有返回错误,则打印返回的消息
        // 到控制台.
        fmt.Println(message)
    }
    

    在此代码中,您:

    • 日志配置为在其日志消息的开头打印命令名称("greetings:"),而不显示时间戳或源文件信息.
    • 将两个 Hello 返回值包括error分配给变量.
    • Hello 参数从 Gladys 的名称更改为空字符串,以便您可以尝试你的错误处理代码.
    • 查找非nil error值。在这种情况下,没有意义继续。
    • 使用标准库的log 包中的函数输出错误信息。如果出现错误,请使用log包的Fatal 函数打印错误并停止程序。
  3. hello 目录中的命令行中,运行 hello.go 以确认代码是否正常工作。

    现在您传入一个空名称,您将收到错误消息.

    $ go run .
    greetings: empty name
    exit status 1
    

这是 Go 中的常见错误处理:以值形式返回错误,以便调用方可以检查它.

接下来,您将使用 Go 切片返回随机选择的问候语.