前言:
647目录如下:
Go语言基础(一)—— 简介、环境配置、HelloWorld
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) } 复制代码
问: 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
!
可能会导致:
health check crash
因此,需要谨慎使用 recover
。
最后,本系列我是在蔡超老师的 技术分享 下总结、实战完成的, 感谢蔡超老师的 技术分享 。
PS:另附上,分享链接: 《Go语言从入门到实战》 祝大家学有所成,工作顺利。谢谢!
以上所述就是小编给大家介绍的《Go语言基础(四)—— 优质的容错处理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。