zoukankan      html  css  js  c++  java
  • go 中recover捕获异常

    recover 仅在延迟函数 defer 中有效,在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果.
    重要的事再说一遍:仅当在一个defer函数中被完成时,调用recover()才生效。

    我们来一段错误的代码:

    package main
    
    import "fmt"
    
    func main() {
        recover() // 无任何作用
        panic("停止运行")
        recover() // 不会执行到
        fmt.Println("结束")
    }

    输出:

    panic: 停止运行
    
    goroutine 1 [running]:exit status 2

    修改下,正确的代码:

    package main
    
    import "fmt"
    
    func main() {
        defer func() {
            fmt.Println("捕获到异常:", recover())
        }()
        panic("手动抛出异常")
    }

    输出:

    捕获到异常: 手动抛出异常

    重要的事再说一遍:recover()的调用仅当它在defer函数中被直接调用时才有效。

    继续来看一段错误的代码:

    package main
    
    import "fmt"
    
    func doRecover() {
        fmt.Println("捕获到异常 =>", recover()) //输出: 捕获到异常 => <nil>
    }
    func main() {
        defer func() {
            doRecover() //注意:这里间接使用函数,在函数中调用了recover()函数,
            // panic 没有恢复,没有捕获到错误信息
        }()
        panic("手动抛出异常")
    }

    输出:

    捕获到异常 => <nil>
    panic: 手动抛出异常
    goroutine 1 [running]:
    main.main()
    exit status 2

    总结:panic配合recover使用,recover要在defer函数中直接调用才生效。

  • 相关阅读:
    Hznu_0j 1533 计算球体积(水)
    电子警察
    UVA ——利用常量数组
    排序算法
    分解质因数
    几种数
    动态规划
    C. The Football Season (枚举) ( Codeforces Round #592 (Div. 2) )
    Fibonacci前n项和 (矩阵乘)
    2153: D.ly的排队问题 (拓扑排序)(vector , set , priority_queue )
  • 原文地址:https://www.cnblogs.com/phpper/p/12059701.html
Copyright © 2011-2022 走看看