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

栏目: IT技术 · 发布时间: 5年前

前言:

647

目录如下:

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

defer func
panic

我们举个简单的例子:

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 ! 可能会导致:

health check
crash

因此,需要谨慎使用 recover

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

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


以上所述就是小编给大家介绍的《Go语言基础(四)—— 优质的容错处理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

网络多人游戏架构与编程

网络多人游戏架构与编程

格雷泽 (Joshua Glazer)、马达夫 (Sanjay Madhav) / 王晓慧、张国鑫 / 人民邮电出版社 / 2017-10-1 / CNY 109.00

本书是一本深入探讨关于网络多人游戏编程的图书。 全书分为13章,从网络游戏的基本概念、互联网、伯克利套接字、对象序列化、对象复制、网络拓扑和游戏案例、延迟、抖动和可靠性、改进的延迟处理、可扩展性、安全性、真实世界的引擎、玩家服务、云托管专用服务器等方面深入介绍了网络多人游戏开发的知识,既全面又详尽地剖析了众多核心概念。 本书的多数示例基于C++编写,适合对C++有一定了解的读者阅读。本......一起来看看 《网络多人游戏架构与编程》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具