返回并处理一个错误

本文翻译自《Return and handle an error》。

能处理错误是可靠代码的基本特征。在本节中,你将添加一些代码以从greetings模块返回一个错误,然后在调用方处理它。

注意:本主题是从《创建一个Go模块》开始的多部分教程的一部分。

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

如果你不知道该问候谁,回复一句问候语就没有意义。如果name为空,则向调用者返回一个错误。将以下代码复制到greetings.go并保存文件。

package greetings

import (
    "errors"
    "fmt"
)

// Hello函数向给出名字的人返回一句问候语。
func Hello(name string) (string, error) {
    // 如果名字没有给出,就返回一个错误信息。
    if name == "" {
        return "", errors.New("empty name")
    }

    // 如果给出了名字,就返回一句嵌入了该名字的问候语。
    // in a greeting message.
    message := fmt.Sprintf("Hi, %v. Welcome!", name)
    return message, nil
}

在此代码中,你:

  • 更改了Hello函数的代码,使其返回两个值:一个字符串和一个错误。你的调用者将检查第二个值以查看是否发生了错误。(任何Go函数都可以返回多个值。有关更多信息,请参阅Effective Go。)
  • 添加一个if语句来检查无效请求(name为空字符串),如果请求无效则返回一个错误。errors.New函数返回一个错误,其中包含错误信息。
  • 在成功返回中添加nil(表示没有错误)作为第二个值。这样,调用者就可以看到函数成功返回了。

2 在你的hello/hello.go文件中,处理Hello函数返回的错误以及非错误值。 将以下代码粘贴到hello.go中。

package main

import (
    "fmt"
    "log"

    "example.com/greetings"
)

func main() {
    // 设置预定义的日志记录器的属性,包括设置日志条目的前缀,设置标志0以禁用打印时间、源文件和行号。
    log.SetPrefix("greetings: ")
    log.SetFlags(0)

    // 请求一句问候语。
    message, err := greetings.Hello("")
    // 如果返回错误,将其打印到控制台并退出程序。
    if err != nil {
        log.Fatal(err)
    }

    // 如果没有返回错误,将返回的消息打印到控制台。
    fmt.Println(message)
}
  • 配置log以在其日志消息的开头打印命令名称 (“greetings: “),不带时间戳或源文件信息。
  • Hello函数的两个返回值(包括错误)分配给变量。
  • Hello函数参数从具体的名称更改为空字符串,以便你可以尝试运行错误处理代码。
  • 查找非零值错误。在这种情况下继续下去是没有意义的。
  • 使用标准库log包中的函数输出错误信息。如果出现错误,则使用log包的Fatal函数打印错误信息并停止程序。

3 在hello目录的命令行中,运行hello.go以确认代码有效。

现在你传递的是一个空名称,你将收到一个错误。

$ go run .
greetings: empty name
exit status 1

这是Go中的常见的错误处理方式:将错误作为值返回,以便调用者可以检查它。

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注