美文网首页
Go语言基础(四)—— 优质的容错处理

Go语言基础(四)—— 优质的容错处理

作者: 齐舞647 | 来源:发表于2020-02-03 16:53 被阅读0次

前言:
本专题用于记录自己(647)在Go语言方向的学习和积累。
系列内容比较偏基础,推荐给想要入门Go语言开发者们阅读。

目录如下:
Go语言基础(一)—— 简介、环境配置、HelloWorld
Go语言基础(二)—— 基本常用语法
Go语言基础(三)—— 面向对象编程
Go语言基础(四)—— 优质的容错处理
Go语言基础(五)—— 并发编程
Go语言基础(六)—— 测试、反射、Unsafe
Go语言基础(七)—— 架构 & 常见任务
Go语言基础(八)—— 性能调优


引子:
Go语言本身没有try/catch异常机制,因为Go的三位创始人在设计Go语言之出觉得这样写会变得很繁琐。
但因为:Go本身支持函数多返回值,因此在写函数的时候,可以优先考虑容错处理。

接下来,我们来看看在Go语言中如何做容错处理。

一、Go中的容错处理

  • 首先,我们要知道:Go语言中没有try/catch异常机制。

  • 其次,要实现容错处理:使用error类型即可,默认实现error接口。

type error interface {
    Error() string
}
  • 通过errors.New快速创建error实例。
var xxxError = errors.New("xxxxx") // 快速创建错误类型

接下来举一个例子:
我们把之前写的Fibonacci的例子加上容错处理,就变成了下面这样。

函数添加了多返回值,最后一个返回error。
若error有值,说明有异常;
若error无值,说明程序正常。

var LessThanTwoError = errors.New("n shoule not less than 2") // 定义错误类型

func GetFibonacci(n int) ([]int, error) {
    // 容错处理
    if n <= 2 {
        return nil, LessThanTwoError
    }

    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 value, err := GetFibonacci(0); err != nil {
        if err == LessThanTwoError {
            fmt.Println("It is less error.")
        }
        t.Error(err)
    } else {
        t.Log(value)
    }
}

二、panic、recover、os.Exit

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

我们举个简单的例子:

func TestPanic(t *testing.T) {
    defer func() {
        fmt.Println("Finally!")
    }()
    fmt.Println("Test panic is Started.")
    panic(errors.New("Something wrong!"))
}

其实,os.Exit也可以退出程序。

func TestOsExit(t *testing.T) {
    fmt.Println("Test os.Exit is Started.")
    os.Exit(0)
}

问:panicos.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


最后,本系列我是在蔡超老师的技术分享下总结、实战完成的,
感谢蔡超老师的技术分享

PS:另附上,分享链接:《Go语言从入门到实战》
祝大家学有所成,工作顺利。谢谢!

相关文章

  • Go语言基础(四)—— 优质的容错处理

    前言:本专题用于记录自己(647)在Go语言方向的学习和积累。系列内容比较偏基础,推荐给想要入门Go语言开发者们阅...

  • go语言基础

    go语言基础 go 语言接口

  • GO语言基础(四)

    方法 Go 没有类。不过你可以为结构体类型定义方法。方法就是一类带特殊的 接收者 参数的函数。方法接收者在它自己的...

  • 初识Go语言-1

    Go语言学习路径 初识Go语言 Go语言环境搭建与IDE安装 Go语言基础语法 Go语言数据类型 Go语言变量和常...

  • Go入门系列(四)函数

    目录:一、基础二、匿名三、接口四、错误处理 一、基本函数 Go语言的函数声明格式为: 基本的声明、调用、传参方式如...

  • Go语言入坑

    GO语言基础 认识并安装GO语言开发环境 Go语言简介 Go语言是谷歌2009年发布的第二款开源编程语言 go语言...

  • Go语言基础语法--注释、基础结构2

    章节 GO语言基础语法--注释、基础结构(重要) 1.GO语言基础语法---注释、基础结构 基础结构注意事项 源文...

  • Go语言探索 - 12(结局)

    Go语言基础系列博客用到的所有示例代码 上一篇文章文章主要学习了Go语言中的接口、反射以及错误和异常处理。本篇文章...

  • 《GO语言圣经》读书笔记 第三章 基础数据类型

    Go语言将数据类型分为四类:** 基础类型、复合类型、引用类型和接口类型 ** 整型 Go语言的数值类型包括几种不...

  • Go 语言基础——错误处理

    学习目标 掌握错误处理 掌握自定义错误处理 掌握defer关键字的使用 错误处理 GO没有异常处理机制 Go语言引...

网友评论

      本文标题:Go语言基础(四)—— 优质的容错处理

      本文链接:https://www.haomeiwen.com/subject/wlvnthtx.html