美文网首页
Golang中的defer、recover、panic

Golang中的defer、recover、panic

作者: 我是不是小明 | 来源:发表于2017-07-18 10:48 被阅读0次

    golang没有类似C中的try catch finlly,但是提供了defer revover panic

    defer“延迟” 函数调用返回之前按照先进先出的顺序进行调用defer中的函数。

    使用规则:1.defer函数中的参数值再定义时即进行计算。

    func a() {
      i := 0
      defer fmt.Println(i)
      i++
      return
    }
    

    先进后出原则

    func b() {
      for i := 0; i < 4; i++ {
      defer fmt.Print(i)
      }
    }
    

    可以读取并设置返回值

    func c() (i int) {
      defer func() { i++ }()
      return 1
    }
    

    panic "恐慌"函数执行时,意味着函数进入恐慌模式,抛出异常。如果函数有panic函数执行,则想上一层调用者返回panci信息,上一层也按照此逻辑执行,如果goroutine没有处理panic信息,则goroute会异常崩溃,如果是主goroute,则程序崩溃。

    recover“恢复”用于处理panic抛出的异常信息

    package main
    import "fmt"
    func main() {
        f()
        fmt.Println("Returned normally from f.")
    }
    func f() {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println("Recovered in f", r)
            }
        }()
        fmt.Println("Calling g.")
        g(0)
        fmt.Println("Returned normally from g.")
    }
    func g(i int) {
        if i > 3 {
            fmt.Println("Panicking!")
            panic(fmt.Sprintf("%v", i))
        }
        defer fmt.Println("Defer in g", i)
        fmt.Println("Printing in g", i)
        g(i + 1)
    }
    其输出结果为:
    Calling g.
    Printing in g 0
    Printing in g 1
    Printing in g 2
    Printing in g 3
    Panicking!
    Defer in g 3
    Defer in g 2
    Defer in g 1
    Defer in g 0
    Recovered in f 4
    Returned normally from f.
    
    

    相关文章

      网友评论

          本文标题: Golang中的defer、recover、panic

          本文链接:https://www.haomeiwen.com/subject/ncickxtx.html