golang笔记——异常处理

函数返回值处理异常

golang为了避免像写Java一样滥用try catch,可以使用函数多返回值的特性来进行异常处理,例如:

type error interface{
    //定义一个错误类型
    Error() string
}
func sqrt(f float64) (float64, error)  {
    if f < 0 {
        return 0, errors.New("负数平方根不能是0")
    }

    return math.Sqrt(f),  nil
}
func main() {
    Println(sqrt(22.65))
    Println(sqrt(-100))
}

输出:

4.759201613716317 <nil>
0 负数平方根不能是0

所以如果返回的error类型部位nil的时候,就说明发生了异常

defer、panic、recover处理异常

panic

是golang一个内建函数,可以中断原有的控制流程,进入一个令人恐慌的流程中。当函数F调用panic,函数F的执行被中断,但是F中的延迟函数会正常执行,然后F返回到调用它的地方。在调用的地方,F的行为就像调用了panic。这一过程继续向上,直到发生panic的goroutine中所有调用的函数返回,此时程序退出。恐慌可以直接调用panic产生。也可以由运行时错误产生,例如访问越界的数组。

Recover

是一个内建的函数,可以让进入令人恐慌的流程中的goroutine恢复过来。recover仅在延迟函数中有效。在正常的执行过程中,调用recover会返回nil,并且没有其它任何效果。如果当前的goroutine陷入恐慌,调用recover可以捕获到panic的输入值,并且恢复正常的执行

在实际使用的时候,我们可以使用defer函数,在异常结束程序前拿到recover返回的错误值,进行处理

示例:

func f() {
    Println("a")
    panic(55)  // 错误,类似java throw,过程会向上传递直到defer执行
    Println("b")

    Println("f")
}
func main() {

      defer func() {
            Println("c")
            if err := recover(); err != nil {
                Println(err)
            }
            Println("d")
        }()
        f()

}

这样,我们在defer执行的时候可以拿到error的值,就像是java里面catch了一个exception一样

输出结果:

a
c
55
d
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 序言 错误和异常是两个不同的概念,非常容易混淆。很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使...
    _张晓龙_阅读 78,955评论 16 137
  • Go入门 Go介绍 部落图鉴之Go:爹好还这么努力? 环境配置 安装 下载源码编译安装 下载相应平台的安装包安装 ...
    齐天大圣李圣杰阅读 10,074评论 0 26
  • 本文为转载,原文:Golang 学习笔记(07)—— 错误及异常处理 基础知识 错误指的是可能出现问题的地方出现了...
    ChainZhang阅读 4,587评论 0 4
  • 选择题 [primary] 下面属于关键字的是() A. func B. def C. struct D. cla...
    盘木阅读 5,771评论 0 29
  • 图片发自简书App 图片发自简书App 花谢 你最后的目光 如雨 湿透了我 沒有女儿红 取一瓢梅花湖的水 为你举杯...
    王紅林阅读 2,241评论 0 0