美文网首页
疑难杂症:recover不能捕获deadlock异常

疑难杂症:recover不能捕获deadlock异常

作者: 坚持到底v2 | 来源:发表于2022-09-01 10:11 被阅读0次

因为 fatal error: all goroutines are asleep - deadlock! 这种程序的异常退出,其实不是 "异常" 引起的,
例如 主协程因为 读取管道发生阻塞 , 而且该阻塞没有可能解除, 此时就会产生 deadlock 致命错误,从而导致程序异常退出, 但这不属于异常的范畴,所以自然也就不能被 recover 捕获

recover() 函数不能捕获如下情况的异常:
(1) 如果在程序中直接 os.Exit(0) 会导致程序直接退出,不会执行 defer
(2) 如果程序发生致命错误(fatal error) 会导致程序直接退出,不会执行 defer

func main() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("在for循环中多次调用调用 t1 := <-timer1.C 引发异常:", err)
        }
    }()
    timer1 := time.NewTimer(time.Millisecond)
    for i := 0; i < 2; i++ {
        t1 := <-timer1.C  // 第二次执行到这里程序会异常中断,不会被defer捕捉,
        // 因为严格来说这不是异常,而是 fatal error: all goroutines are asleep - deadlock!
        // 因为 timer1.C 是一个 <-chan Time 类型的管道,该管道在触发一次后会被置为nil,此时读取它的值会发生阻塞
        // 所以会发生deadlock
        // 如果是多协程的话, 如果主协程要等待该协程的话,也会发生deadlock,否则只是该协程不会执行完成,不会引发异常
        // 综上, defer不能捕捉该 "异常" , 因为这不是异常,而是程序逻辑错误
        fmt.Printf("t1:%v\n", t1)
    }
}

相关文章

  • 疑难杂症:recover不能捕获deadlock异常

    因为 fatal error: all goroutines are asleep - deadlock! 这种程...

  • go基本语法操作

    异常处理 异常类型error 异常捕获recover 异常抛出panic 字符串处理 字符串常用操作 正则表达式 ...

  • Golang异常处理

    Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。异常和错误是不...

  • 20年第35周:go defer,panic,recover,异

    go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。 一、go的d...

  • go错误捕获的正确使用姿势

    go开发初学者应该都知道,recover 能够捕获到panic异常错误,打印错误日志,防止程序崩溃,但是很多人用在...

  • 2019-05-05

    一 、异常捕获 1.异常捕获 正常情况下程序出现异常,程序会直接崩溃,不能接着往后面执行。异常捕获就是为了程序出现...

  • sleep()-03-02

    Sleep需要捕获或者抛出异常,但是run方法不能抛出异常throws,所以在run方法中只能捕获异常(try c...

  • Python面向对象2

    异常 捕获异常image.png根据错误类型捕获异常image.png 未知错误捕获image.png 捕获异常完...

  • 工作总结-002

    异常捕获service捕获业务异常,自定义BaseException;interface捕获业务异常,以及其他异常...

  • Day13-总结

    1.异常捕获 当程序发生异常对的时候,默认情况下程序会崩溃,不能接着往后执行;捕获异常就是让程序发生异常的时候不崩...

网友评论

      本文标题:疑难杂症:recover不能捕获deadlock异常

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