golang 中 recover()的使用方法

Recover 是一个Go语言的内建函数,可以让进入宕机流程中的 goroutine 恢复过来,recover 仅在延迟函数 defer 中有效,在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果,如果当前的 goroutine 陷入恐慌,调用 recover 可以捕获到 panic 的输入值,并且恢复正常的执行。
通常来说,不应该对进入 panic 宕机的程序做任何处理,但有时,需要我们可以从宕机中恢复,至少我们可以在程序崩溃前,做一些操作,举个例子,当 web 服务器遇到不可预料的严重问题时,在崩溃前应该将所有的连接关闭,如果不做任何处理,会使得客户端一直处于等待状态,如果 web 服务器还在开发阶段,服务器甚至可以将异常信息反馈到客户端,帮助调试。

在其他语言里,宕机往往以异常的形式存在,底层抛出异常,上层逻辑通过try/catch 机制捕获异常,没有被捕获的严重异常会导致宕机,捕获的异常可以被忽略,让代码继续运行。

Go语言没有异常系统,其使用 panic 触发宕机类似于其他语言的抛出异常,recover 的宕机恢复机制就对应其他语言中的 try/catch 机

Recover的用法:

defer可以读取有名返回值

理论:如果不进行recover,便会导致整个程序挂掉,

Recover()用法是:Recover()写在defer中,并且在可能发生panic的地方之前,先调用此defer的东西(让系统方法域结束时,有代码要执行。)当程序遇到panic的时候(当然,也可以正常的调用出现的异常情况),系统将跳过后面的代码,进入defer,如果defer函数中recover(),则返回捕获到的panic的值。

总结:使用recover()捕捉panic异常的时候,则需要defer来读取一个匿名函数,

defer func(){
If err:=recover();err!=nil{//注意必须要判断
打印捕捉的err内容
}
}()//用来调用此匿名函数

package main

import (
“fmt”
“log”
)

func tast2() {
fmt.Println(“sssssssss”)
}
func tast(x int) {
defer func() {
if err:=recover();err !=nil{
fmt.Println(err)
}

}()
var a [10]int
a[x]=1222
log.Println(a)
}
func main(){
tast(20)
tast2()
}

希望goroutine在函数执行时不会因崩溃导致剩余程序运行,同时设置一个默认返回值

package main

import (
	"fmt"
	"time"
)

func calcRem(i int) (res int) {
	defer func() {
		if err := recover(); err != nil {
			fmt.Printf("error: %s\n", err)
			res = 999 //干扰输出
		}
	}()

	res = 10 / (10 % i) //当余数取余为0时,res为0
	fmt.Printf("10 / (10 %% %d) = %d\n", i, res)
	return
}

func main() {
	resCH := make(chan int, 10)
	defer close(resCH)

	for i := 1; i <= 10; i++ {
		go func(i int) {
			res := calcRem(i)
			resCH <- res
		}(i)
		time.Sleep(time.Microsecond * 100)
	}
	time.Sleep(time.Second)
	fmt.Printf("ch len is: %d\n", len(resCH))
	for i := 1; i <= 10; i++ {
		res := <-resCH
		fmt.Println(res)
	}
}

output

error: runtime error: integer divide by zero
error: runtime error: integer divide by zero
10 / (10 % 3) = 10
10 / (10 % 4) = 5
error: runtime error: integer divide by zero
10 / (10 % 6) = 2
10 / (10 % 7) = 3
10 / (10 % 8) = 5
10 / (10 % 9) = 10
error: runtime error: integer divide by zero
ch len is: 10
999
999
10
5
999
2
3
5
10
999

到此这篇关于Guam与golang recover()的使用方法的文章就介绍到这了,更多相关golang recover()用法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Golang 错误捕获Panic与Recover的使用

    目录 一.Golang 错误是什么? 二.错误校验 1.方法 2.判断错误 三.错误捕获 1.方法 2.defer 的使用 总结 一.Golang 错误是什么? 对于Go语言(Golang)的错误是通过返回值的方式,来强迫调用者对错误进行处理,要么你通过 _ 忽略,要么你处理.对于这种设计方式,我们通常需要会写大量的 if err != nil 判断.我们可以通过方法来做到校验. 这类代码非常的多,尽管工程中 error 大部分都是nil,也就是没有任何错误,但是非nil的时候,就意味着错误就出

  • 小学生也能看懂的Golang异常处理recover panic

    🌌 专注Golang,Python语言,云原生,人工智能领域得博主 💜 过去经历的意义在于引导你,而非定义你, 💜 只要我们足够努力,任何人都有无限潜力 🚀panic 抛出异常函数 🚀recover 捕获异常函数 📣1:在一个主协成内捕获异常 package main import ( "fmt" ) func main(){ defer func(){ err := recover() if err != nil{ fmt.Println("捕获到异常") } }() panic("异常出现") //抛出异常,代表错误代码 } 🚀运行结果 📣2:假设子协成内部错误,看看主协成能不能捕获到 package main import ( "fmt" ) func Calculate(){ panic("异常出现") // 同样代表错误代码 } func main(){ defer func()

  • golang 中 recover()的使用方法

    Recover 是一个Go语言的内建函数,可以让进入宕机流程中的 goroutine 恢复过来,recover 仅在延迟函数 defer 中有效,在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果,如果当前的 goroutine 陷入恐慌,调用 recover 可以捕获到 panic 的输入值,并且恢复正常的执行.通常来说,不应该对进入 panic 宕机的程序做任何处理,但有时,需要我们可以从宕机中恢复,至少我们可以在程序崩溃前,做一些操作,举个例子,当 web 服务

  • 在 Golang 中实现 Cache::remember 方法详解

    项目需要把部分代码移植到 Golang , 之前用 Laravel 封装的写起来很舒服,在 Golang 里只能自动动手实现. 一开始想的是使用 interface 实现,但是遇到了一个坑, Golang 里的组合是一个虚假的继承 package main import "fmt" type Person interface { Say() Name() } type Parent struct { } func (s *Parent) Say() { fmt.Println(&quo

  • 在Golang中使用Redis的方法示例

    周五上班的主要任务是在公司老平台上用redis处理一个队列问题,顺便复习了一下redis操作的基础知识,回来后就想着在自己的博客demo里,用redis来优化一些使用场景,学习一下golang开发下redis的使用. Redis简单介绍 简介 关于Redis的讨论,其实在现在的后台开发中已经是个老生常谈的问题,基本上也是后端开发面试的基本考察点.其中 Redis的背景介绍和细节说明在这里就不赘述.不管怎么介绍,核心在于Redis是一个基于内存的key-value的多数据结构存储,并可以提供持久化

  • Golang中List的实现方法示例详解

    前言 为了快速回顾Go基本的语法知识,打算用Go中的基本语法以及特性来实现一些常见的数据结构和排序算法,通过分析如何实现一些基本的数据结构,可以很快学习Go的语法特性.记忆更加深刻,掌握更加迅速.这是我认为学习一门新语言入门最好的方式.这也是方便自己以后需要用Go来写东西的一种前期准备,到时候就不用去翻一些教程了.系列博文的第一篇就从如何实现List开始. 需求 大家都知道基本链表得有以下特性:链表的初始化.链表的长度.节点的插入.删除.查找等一些常见的基本操作,最后写好之后,需要测试.关于测试

  • golang中使用mongo的方法介绍

    前言 笔者使用的mongo驱动是mgo, 这个使用的人比较多,文档也比较齐全 官网地址:http://labix.org/mgo 文档地址:https://godoc.org/labix.org/v2/mgo 源码地址:https://github.com/go-mgo/mgo 1. mgo包安装 go get gopkg.in/mgo.v2 但是貌似现在从gopkg.in下载不了,迂回一下,先从github上下载 go get github.com/go-mgo/mgo 下载好了之后,在$GO

  • Go语言中的字符串拼接方法详情

    目录 1.string类型 2.strings包 2.1 strings.Builder类型 2.2 strings.Reader类型 3.bytes.Buffer 3.1 bytes.Buffer:写数据 3.2 bytes.Buffer:读数据 4.字符串拼接 4.1 直接相加 4.2strings.Builder 4.3 strings.Join() 4.4 bytes.Buffer 4.5 append方法 4.6 fmt.Sprintf 5.字符串拼接性能测试 1.string类型 s

  • Golang中如何实现枚举详析

    Golang中怎么实现枚举?下面本篇文章给大家介绍一下Golang中实现枚举的方法,希望对大家有所帮助! 在编程领域里,枚举用来表示只包含有限数量的固定值的类型,在开发中一般用于标识错误码或者状态机.拿一个实体对象的状态机来说,它通常与这个对象在数据库里对应记录的标识状态的字段值相对应. 在编程领域里,枚举用来表示只包含有限数量的固定值的类型,在开发中一般用于标识错误码或者状态机.拿一个实体对象的状态机来说,它通常与这个对象在数据库里对应记录的标识状态的字段值相对应.[相关推荐:Go视频教程]

  • GoLang中panic与recover函数以及defer语句超详细讲解

    目录 一.运行时恐慌panic 二.panic被引发到程序终止经历的过程 三.有意引发一个panic并让panic包含一个值 四.施加应对panic的保护措施从而避免程序崩溃 五.多条defer语句多条defer语句的执行顺序 一.运行时恐慌panic panic是一种在运行时抛出来的异常.比如"index of range". panic的详情: package main import "fmt" func main() { oneC := []int{1, 2,

  • golang 中获取字符串个数的方法

    在 golang 中不能直接用 len 函数来统计字符串长度,查看了下源码发现字符串是以 UTF-8 为格式存储的,说明 len 函数是取得包含 byte 的个数 // string is the set of all strings of 8-bit bytes, conventionally but not // necessarily representing UTF-8-encoded text. A string may be empty, but // not nil. Values

  • 浅谈Golang中创建一个简单的服务器的方法

    我们知道,golang中的net/http包对网络的支持非常好,这样会让我们比较容易的建立起一个相对简单的服务器,我们来看一段代码 func sayHi(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w,"Hi") } func main() { http.HandleFunc("/sayHi", sayHi) log.Fatal(http.ListenAndServe("localhost:80

随机推荐