• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

go 异常处理

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Golang官方推荐的错误处理方式,是建议把err放在每个函数的返回值的最后,也就是每个函数返回至少两个值,一个是正常的结果一个是err。我们在日常的编码中也需要遵循这样的规则来定义func。

这谁能接受?如果这样的话那得话多少时间来处理异常。还好后来出现了recover,可以用它来捕获异常。

recover

如果在defer函数中调用了内置函数recover,并且定义该defer语句的函数发生了panic异常,recover会使程序从panic中恢复,并返回panic value。导致panic异常的函数不会继续运行,但能正常返回。在未发生panic时调用recover,recover会返回nil。让我们以语言解析器为例,说明recover的使用场景。考虑到语言解析器的复杂性,即使某个语言解析器目前工作正常,也无法肯定它没有漏洞。因此,当某个异常出现时,我们不会选择让解析器崩溃,而是会将panic异常当作普通的解析错误,并附加额外信息提醒用户报告此错误。

示例:

package main

import "log"

func main()  {
    defer func(){
        if r := recover();r!=nil{
            log.Printf("Runtime error caught: %v",r)
        }
    }()
    a := 1
    if a == 1{
        panic("nice")
    }

}

如此看来,只要我们在定义每个函数的时候加上上述的defer 语句就可以了,但是这样代码显得冗余,我们再封装一下:

package main

import (
    "errors"
    "log"
)

func main() {
    test()
}

func test()  {
    defer CoverErrorMessage()
    panic(111)
}

func  CoverErrorMessage() {
    if message := recover(); message != nil {
        var err error
        switch x := message.(type) {
        case string:
            err = errors.New(x)
        case error:
            err = x
        default:
            err = errors.New("Unknow panic")
        }
        log.Print("Recovered panic error : ",err)
    }
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
go-pluginhashicorp开源的golang插件框架发布时间:2022-07-10
下一篇:
Go:函数、defer发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap