Go语言基础学习 (六) – 编写一个好的错误处理

前言

在极客上看了蔡超老师的Go语言课程 随手记下来的一些随笔,Go的基础应用及实例,
系列内容比较偏基础,推荐给想要入门Go语言开发者们阅读。

目录如下

Go语言基础学习 (一) – 变量 常量已经与其他语言的差异
Go语言基础学习 (二) -Go语言中的类型转与Go语言中的数组切片
Go语言基础学习 (三) – Go语言内的 Map声明使用与工厂模式
Go语言基础学习 (四) – Go语言函数简单介绍
Go语言基础学习 (五) – 面向对象编程
Go语言基础学习 (六) – 编写一个好的错误处理
Go语言基础学习 (七) – 包(package)
Go语言基础学习 (八) – 并发编程

1. Go的错误机制与简单实例

image-20220223151336227.png

  • 以Fibonacci数列做一个error提示
    
       var NumberTwoError  = errors.New("参数不能小于2")
       var NumberError  = errors.New("参数不能大于100")
    
       func GetFibonacci(n int) ([]int, error)  {
    
        if n > 100{
          return nil,NumberTwoError
        }
    
        if n < 2 {
          return nil,NumberTwoError
        }
    
        fibList := []int{1,1}
        for i :=2; i<n ;i++  {
          fibList = append(fibList,fibList[i-2]+fibList[i-1])
        }
        return fibList,nil
    
       }
    
       func TestGetFibonacci(t *testing.T)  {
       // 此处if判断类处理错误信息
               if v,error := GetFibonacci(1); error!=nil{
                       if error == NumberTwoError {
                               t.Log(error)
                       }
                       if error == NumberError{
                               t.Log(error)
                       }
               }else {
                       t.Log("运行正常",v)
               }
       }
    复制代码
    === RUN   TestGetFibonacci
    error_test.go:32: 参数不能小于2
    --- PASS: TestGetFibonacci (0.00s)
    复制代码
  • 2.panic 与recover

    panic:用于发送不可恢复的错误,执行defer func内的代码块,并请求退出程序。
    recover:用于恢复panic抛出的错误。
    os.Exit:用于直接退出程序。

    image-20220223152626151.png
    image-20220223153220968.png
    代码实例

       
    func TestPanicRecover(t *testing.T)  {
           defer func() {
                fmt.Println("错误信息:",err)
           }()
            fmt.Println("Start")
            panic(errors.New("Something wrong!"))
         
    }
    复制代码
    Start
    错误信息: Something wrong!
    复制代码

    与php内的try方法类似,正常执行程序,panic定义错误,再到defer处抛出错误

    panic与os.Exit对比下的区别

    1.os.Exit退出程序时不会先调用defer func代码块。
    2.os.Exit退出程序时不会输出当前调用栈信息。

    那么,如果我们就是想让程序不crash,有没有办法呢?

    答案是有的,使用recover,但是很不推荐这么使用recover 因为并没有解决发生panic的问题,只是把错误移除,这样是很不安全的。 甚至,如果是因为系统资源panic,这样我们的服务就变成了僵尸服务,虽然活着但无法提供服务功能。

    recover使用方式如下,但一般不推荐使用。

    func TestPanicRecover(t *testing.T) {
    defer func() {
       if err := recover(); err != nil { // 恢复错误
           fmt.Println("recover panic", err)
       }
    }()
    fmt.Println("Test panic is Started.")
    panic(errors.New("Something wrong!"))
    }
    复制代码

    因此,小心使用recover!

    可能会导致

    1.形成僵尸服务进程,使安全检查health check失效
    2. 因为没有crash,导致提供不确定的服务。
    因此,需要谨慎使用recover

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享