返回及处理异常

By | 2021年9月14日

处理错误是可靠代码的一个基本特性。在本节中,您将添加一些代码以从问候语模块返回错误,然后在调用者中处理它。

  1. In greetings/greetings.go, add the code highlighted below.

  2. 在文件greetings/greetings.go中,修改为以下代码,增加引入errors,以及error的处理。

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

    package greetings
    
    import (
       "errors"
       "fmt"
    )
    
    // Hello returns a greeting for the named person.
    func Hello(name string) (string, error) {
       // If no name was given, return an error with a message.
       if name == "" {
           return "", errors.New("empty name")
       }
    
       // If a name was received, return a value that embeds the name
       // in a greeting message.
       message := fmt.Sprintf("Hi, %v. Welcome!", name)
       return message, nil
    }
    

    在这个代码里:

  • Change the function so that it returns two values: a string and an error. Your caller will check the second value to see if an error occurred. (Any Go function can return multiple values. For more, see Effective Go.)
  • 修改该函数使得它返回两个值:string和error。调用者将需要检查第二个值判断是否发生了错误。(所有的Go 函数都可以返回多个值)。
  • Import the Go standard library errors package so you can use its
  • 引入Go标准库errors,利用这个库可以使用它的 errors.New function
  • 添加’if’语句以检查无效请求(名称应为空字符串),如果请求无效,则返回错误。errors.New函数返回一个包含消息的error
  • 在成功返回中添加“nil”(意味着没有错误)作为第二个值。这样,调用方就可以看到函数成功了。
  1. In your hello/hello.go file, handle the error now returned by the

    在hello/hello.go文件中,处理现在返回的error信息。

    将下面代码复制至改文件:

    package main
    
    import (
       "fmt"
       "log"
    
       "example.com/greetings"
    )
    
    func main() {
       // Set properties of the predefined Logger, including
       // the log entry prefix and a flag to disable printing
       // the time, source file, and line number.
       log.SetPrefix("greetings: ")
       log.SetFlags(0)
    
       // Request a greeting message.
       message, err := greetings.Hello("")
       // If an error was returned, print it to the console and
       // exit the program.
       if err != nil {
           log.Fatal(err)
       }
    
       // If no error was returned, print the returned message
       // to the console.
       fmt.Println(message)
    }
    

    在这个代码里:

  • Configure the log package to print the command name (“greetings: “) at the start of its log messages, without a time stamp or source file information.
  • Assign both of the Hello return values, including the error, to variables.
  • Change the Hello argument from Gladys’s name to an empty string, so you can try out your error-handling code.
  • Look for a non-nil error value. There’s no sense continuing in this case.
  • Use the functions in the standard library’s log package to output error information. If you get an error, you use the log package’s Fatal function to print the error and stop the program.
  • 配置log在其日志消息的开头打印命令名(“greetings:”),而不带时间戳或源文件信息。
  • 为变量分配两个“Hello”返回值,包括“error”。
  • 将’Hello’参数从Gladys的名称更改为空字符串,以便可以尝试错误处理代码。
  • 查找非nilerror值。在这种情况下继续下去是没有意义的。
  • 使用标准库的“日志包”中的函数输出错误信息。如果出现错误,则使用’log’包的‘Fatal’函数打印错误并停止程序。
  1. At the command line in the

    执行hello程序,在该目录下执行go run .

    现在我们输入空姓名则返回error。

    $ go run .
    greetings: empty name
    exit status 1
    

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

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

请关注公众号获取更多资料

发表评论

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