首页 > 其他分享 >golang之recover

golang之recover

时间:2023-05-31 18:32:31浏览次数:36  
标签:defer 函数 捕获 程序 golang recover panic

recover是什么

golang的recover是一个内置函数,用于在发生panic时恢复程序的控制流。当程序发生panic时,程序会停止执行当前的函数,并向上层函数传递panic,直到被recover函数捕获。recover函数必须在defer语句中调用,否则无法捕获panic。如果没有发生panic或者没有被recover函数捕获,程序会终止执行。

recover怎么用

recover函数的主要用途是在程序发生panic时,恢复程序的控制流,避免程序崩溃。recover函数必须在defer语句中调用,否则无法捕获panic。下面是recover函数的用法:

func recover() interface{}

recover函数返回一个interface{}类型的值,表示捕获到的panic的值。如果没有发生panic或者没有被recover函数捕获,程序会终止执行。

下面是recover函数的应用场景:

  1. 避免程序崩溃

当程序发生panic时,如果没有进行处理,程序会崩溃。使用recover函数可以捕获panic并恢复程序的控制流,避免程序崩溃。例如:

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered:", r)
        }
    }()
    panic("Something went wrong")
}

在上面的例子中,当程序发生panic时,defer语句中的匿名函数会被调用,并且调用recover函数捕获panic。程序会从panic的位置继续执行,而不是终止执行。

  1. 记录日志

当程序发生panic时,我们可以使用recover函数捕获panic,并记录日志,以便后续排查问题。例如:

func main() {
    defer func() {
        if r := recover(); r != nil {
            log.Println("Recovered:", r)
        }
    }()
    panic("Something went wrong")
}

在上面的例子中,当程序发生panic时,defer语句中的匿名函数会被调用,并且调用recover函数捕获panic。程序会从panic的位置继续执行,并记录日志。

  1. 优雅地处理异常

当程序发生异常时,我们可以使用recover函数捕获异常,并进行优雅地处理。例如:

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered:", r)
            // do something to handle the exception
        }
    }()
    // do something that may cause an exception
}

在上面的例子中,当程序发生异常时,defer语句中的匿名函数会被调用,并且调用recover函数捕获异常。我们可以在匿名函数中进行优雅地处理,避免程序崩溃。

总之,recover函数是golang中用于捕获panic并恢复程序控制流的重要函数。它可以帮助我们处理程序中的异常情况,使程序更加健壮和可靠。

写在最后

感谢大家的阅读,晴天将继续努力,分享更多有趣且实用的主题,如有错误和纰漏,欢迎给予指正。 更多文章敬请关注作者个人公众号 晴天码字

标签:defer,函数,捕获,程序,golang,recover,panic
From: https://blog.51cto.com/u_15855860/6388877

相关文章

  • golang实现设计模式之抽象工厂模式总结-代码、优缺点、适用场景
    抽象工厂模式也是一种创建型的设计模式,其是在工厂模式的基础上实现更高程度的内聚。我们知道在工厂模式中,一种产品类就需要新建个对应的工厂类生成产品的实例,这会有什么问题呢?虽然工厂模式解决了简单工厂模式不好扩展的问题,实现了OCP,但一种产品就需要新建一个工厂类,比如有10000种......
  • golang实现设计模式之工厂模式总结-代码、优缺点、适用场景
    工厂模式也是一种创建型模式,它与简单工厂不同的是将实例的创建推迟到具体的工厂类方法中实现,每一种产品生成一个对应的工厂,从而替换掉简单工厂方法模式中那个静态工厂方法。所以在工厂模式中,不同产品就由不同的工厂生产,每次增加产品时,我们就不需要在类似在简单工厂中,在统一的工厂......
  • Recovering unassigned shards on elasticsearch 2.x——副本shard可以设置replica为0
    Recoveringunassignedshardsonelasticsearch2.x摘自:https://z0z0.me/recovering-unassigned-shards-on-elasticsearch/Igotaccrosstheproblemwhendecidedtoaddanodetotheelasticsearchclusterandthatnodewasnotabletoreplicatetheindexesofthe......
  • Golang扫盲式学习——GO并发 | (一)
    并发与并行......
  • 技术招聘漫谈 | 正在招Golang工程师的你,赶快收藏这份识人秘籍!
    各位技术面试官,欢迎来到新一期的技术招聘漫谈专栏。在前两期的专栏中,我们解析了前端工程师以及 Java工程师 这两个常见技术岗位的招聘技巧。今天,我们想把目光聚焦在一个前景与“钱”景都非常火热的岗位——Golang开发工程师。《腾讯2022年度研发大数据报告》显示,Golang连......
  • golang链式调用
    简单举例packagemain//主要就是前一个方法的返回值,具有下一个方法,因此可以实现链式调用import"fmt"typeStustruct{ Namestring Ageint}func(p*Stu)SetName(namestring)*Stu{ p.Name=name returnp}func(p*Stu)SetAge(ageint)*Stu{ p.Age......
  • 一次折腾 Golang 泛型、反射和 gorm 框架的记录
    事情的起初是一个很常见的需求:批量更新多条记录的相同字段,每条记录对应的字段值不同因此无法批量Update。看着没啥难度却没想到从开头到结束整整花了一天的时间,遂有此文。首先尝试了gorm自带的Save(),按理说gorm本身会自动识别零值不去更新,这样直接创建一个实例数组挨个赋值......
  • Golang入门笔记
    第一个Go程序packagemain //包,表明代码所在的模块(包)import"fmt" //引入代码依赖//功能实现funcmain(){ fmt.Println("HelloWorld");}编译执行➜go-examplegit:(master)✗cdsrc/example/main➜maingit:(master)✗lshello_world.go➜maingit:......
  • Golang GIN 接收结构体切片(前端对象数组)
    想接收前端这样的数据格式:【json数组】[{"password":"casso","mobile":"13456789999","nick_name":"go","icon":"地址"},{"passwor......
  • Golang环境——GOPATH vs go.mod
    GOPATH在本文中,我们将探讨Go编程的传统环境与基础环境之间的差异go.mod。这种区别对Go开发人员如何构建和管理他们的项目工作区和依赖项具有重要意义。我们将从了解GOPATH环境、它的组织和结构开始。然后,我们将探讨go.mod采用这种方法来提供模块化和灵活的方式来组织Go项......