培训首页  >  web前端新闻  >  兄弟连Go语言panic和recover

兄弟连Go语言panic和recover

[2018-08-22 16:24:34] 浏览量:57 来源:

北京兄弟连IT

  Go语言经过十余年的发展,已成为流行的新兴语言。目前,Go语言已成为云计算领域的选语言,且随着近几年区块链的流行,作为底层开发语言的Go再次火爆成为区块链领域编程语言,IBMFabic等重量级的区块链项目都是基于Go语言开发的。

 

  殊不知,Go语言可开发的应用项目还有很多。除云计算、区块链等开源项目外,还包含Devops、人工智能、游戏、存储引擎、Web、系统/命令行工具、中间件、测试/持续交付、文件系统等各方面的开源项目。

 

正常的函数执行流程将立即终止,但函数中之前使用defer关键字延迟执行的语句将正常展开执行,之后该函数将返回到调用函数,并导致逐层向上执行panic()流程,直到所属的goroutine中所有正在执行的函数将被终止。错误信息将被报告,包括panic()的参数类型interface()我们可以看到,panic可以接收任意类型的数据

panic(404)

panic("network borken")

panic("Error("file not exists")

 

recover

 

recover函数用于终止错误处理流程。recover应该在defer关键字的函数中执行以有效截取错误处理流程

 

实例1

 

package main

 

import (

    "fmt"

)

 

func main() {

    defer func() {

        if r := recover(); r != nil {

            fmt.Println("detail:", r)

        }

    }()

 

    fmt.Println("before painc")

    panic("error1")

    panic("error2")

    fmt.Println("after panic")

    return

}

运行结果

 

before painc

detail: error1

实例2

 

package main

 

import (

    "fmt"

)

 

func main() {

    fmt.Println("before painc")

    panic("error1")

    panic("error2")

    fmt.Println("after panic")

    return

}

运行结果

 

before painc

panic: error1

 

goroutine 1 [running]:

main.main()

    /home/kenmy/go/src/github.com/shadowsocks/shadowsocks-go/sample-config/panic.go:17 +0xdd

实例3

 

package main

 

import (

    "fmt"

)

 

func main() {

    defer func() {

        if r := recover(); r != nil {

            fmt.Println("detail:", r)

        }

    }()

 

    test()

    fmt.Println("end")

    return

}

 

func test() {

    defer func() {

        if r := recover(); r != nil {

            fmt.Println("detail0:", r)

        }

    }()

    fmt.Println("before painc")

    panic("error1")

    panic("error2")

    fmt.Println("after panic")

}

运行结果

 

before painc

detail0: error1

end

实例4

 

package main

 

import (

    "fmt"

)

 

func main() {

    defer func() {

        if r := recover(); r != nil {

            fmt.Println("detail:", r)

        }

    }()

 

    test()

    fmt.Println("middle")

    panic("error3")

    fmt.Println("end")

    return

}

 

func test() {

    defer func() {

        if r := recover(); r != nil {

            fmt.Println("detail0:", r)

        }

    }()

    fmt.Println("before painc")

    panic("error1")

    panic("error2")

    fmt.Println("after panic")

}

运行结果

 

before painc

detail0: error1

middle

detail: error3

实例5

 

package main

 

import (

    "fmt"

)

 

func main() {

 

    test()

    fmt.Println("middle")

    panic("error3")

    fmt.Println("end")

    return

}

 

func test() {

    fmt.Println("before painc")

    panic("error1")

    panic("error2")

    fmt.Println("after panic")

}

运行结果:

 

before painc

panic: error1

 

goroutine 1 [running]:

main.test()

    /home/kenmy/go/src/github.com/shadowsocks/shadowsocks-go/sample-config/panic.go:20 +0xdd

main.main()

  /home/kenmy/go/src/github.com/shadowsocks/shadowsocks-go/sample-config/panic.go:10 +0x26

高能预警,兄弟连教育区块链直播课程8月持续火爆来袭!

原价1188元的12节区块链进阶课程,现仅需1元!

还可取《Go语言基础实战项目开发》与《Go语言实战项目开发》教材两本!!

限量!!先到先得!!

http://www.ydma.cn/open/course/24

关注兄弟连区块链公众号可以获得更多区块链技术干货!!!

 


文中图片素材来源网络,如有侵权请联系删除
  • 软件开发
  • 软件测试
  • 数据库
  • Web前端
  • 大数据
  • 人工智能
  • 零基础
  • 有HTML基础
  • 有PHP基础
  • 有C语言基础
  • 有JAVA基础
  • 其他计算机语言基础
  • 周末班
  • 全日制白班
  • 随到随学

网上报名

热门信息