3.28 Go 处理错误格式入门|Go主题月

281 阅读2分钟

  上两章节中简单描述了,我们如何自定义模块,以及如何依赖自定义模块进行方法的调用。接下来我们来学习下如何在Go中更好的处理异常。

  处理错误是可靠代码的一个基本特性。接下来通过添加一些代码来从greetings模块返回一个错误,然后在调用者中处理它。

代码编写

  需要对于上节我们编写的代码进行修改。

  1. 修改代码,增加判断条件,如果名称为空,则返回一个错误(修改后的代码如下):

    package greetings
    
     import (
         "errors"
         "fmt"
     )
    
     func Hello(name string) (string, error) {
         if name == "" {
             return "", errors.New("empty name")
         }
    
         message := fmt.Sprintf("Hi, %v. Welcome!", name)
         return message, nil
     }
    

    在上述代码中,我们可以发现以下变化:

    1. 函数返回值数目增加。(调用者可以通过第二个值进行判断是否发生错误,详情见Effective Go
    2. 导入Go标准库错误包。
    3. 增加条件判断,如果输入空字符串,则进行返回一个包含错误的返回值。
    4. 如果调用成功,第二个返回值则置空,表示当前是正常调用返回。
  2. 接下来进行hello.go代码的修改,我们需要增加错误的一种情况处理。

    package main
    import (
         "fmt"
         "log"
         "example.com/greetings"
     )
    func main() {
         log.SetPrefix("greetings: ")
         log.SetFlags(0)
    
         message, err := greetings.Hello("")
         if err != nil {
             log.Fatal(err)
         }
         fmt.Println(message)
     }
    

    针对调用方,我们也进行了如下的修改变化:

    1. 引入日志包,在方法调用之前进行输出。
    2. 调用函数返回值进行赋值给临时变量。
    3. 判断是否有错误产生,如有错误发生则进行错误日志的打印并停止程序。
  3. 接下来我们运行hello.go程序,看看程序代码是否生效。

    [root@montos-prod hello]# go run .
     greetings: empty name
     exit status 1
    

  可以看出代码的输出结果跟我们预想的一致,此时处理异常事件也就完成了。

代码运行总结

  异常可能是代码在运行期间可能经常发生的事情,我们只有处理好对于异常的处理,才能更好的使我们代码健壮起来。

对于Go这种处理异常的逻辑,我们需要注意的就是代码如果是你自己编写的,那么你是了解返回值中是否包含异常的情况,如果不是你编写的,那么就看对应的开发是否能够将文档更好的完善,标注好异常参数的定义。