本文翻译自《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。)
- 导入Go标准库
errors
包,以便你可以使用其errors.New
函数。
- 添加一个
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切片随机返回选择的一句问候语。