• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    golang panic及处理机制

    一 panic机制

      panic会将这个异常不断向上抛出,直到有地方处理它,如果有处理,则不会再向上抛出。倘若没有处理,那么最终会导致main挂掉.

     golang虽然没有try catch机制,却有一种类似的recover机制,后续demo我们可以观测到它的用法和作用

    二 实例   

    2.1 main用recover

    func main() {
        defer func() {
            if err := recover(); err != nil {
                log.Println("err:", err)
            }
        }()
        go test1()
        time.Sleep(time.Second * 3)
        panic(errors.New("stop test1"))
        log.Println("123")
        select {}
    }
    func test1() {
        for {
            tm := time.NewTicker(time.Second)
            select {
            case -tm.C:
                log.Println("test1")
            }
        }
    }

    2.2 func用recover

    func main() {
        defer func() {
            if err := recover(); err != nil {
                log.Println("err:", err)
            }
        }()
        go test1()
        time.Sleep(time.Second * 3)
        makeerr()
        log.Println("123")
        select {}
    }
     
    func test1() {
        for {
            tm := time.NewTicker(time.Second)
            select {
            case -tm.C:
                log.Println("test1")
            }
        }
    }
    func makeerr() {
        defer func() {
            if err := recover(); err != nil {
                log.Println("makeerr:", err)
            }
        }()
        panic(errors.New("stop"))
    }

    此时我们在func中用recover,那么挂掉的只是func,他不会抛到main中,所以main能继续运行,继而main开辟的go test1也能继续运行

    2.3 func用recover且开创goroutine

    func main() {
        defer func() {
            if err := recover(); err != nil {
                log.Println("err:", err)
            }
        }()
     
        time.Sleep(time.Second * 3)
        makeerr()
        log.Println("123")
        select {}
    }
     
    func test1() {
        for {
            tm := time.NewTicker(time.Second)
            select {
            case -tm.C:
                log.Println("test1")
            }
        }
    }
    func makeerr() {
        defer func() {
            if err := recover(); err != nil {
                log.Println("makeerr err:", err)
            }
        }()
        go test1()
        panic(errors.New("stop test"))
    }

    我们发现,func虽然挂掉了,但是他开创的go没挂掉,因为即使是这个函数退出了,新开的协程是相当于基于main下的一个子程,只要main不退出,他依然会“存活”

    2.4 goroutine中panic

    func main() {
        defer func() {
            if err := recover(); err != nil {
                log.Println("err:", err)
            }
        }()
        go test1()
        time.Sleep(time.Second * 3)
        log.Println("123")
        select {}
    }
    func test1() {
        log.Println("test1 start")
        panic(errors.New("stop test1"))
        log.Println("test1 end")
    }

    协程中如果没recover,那么error就会抛向main,main就会挂掉,从而没有执行到后面的log打印。

    ---> 这种情况,main中做defer recover是没用的

    2.5 func1内嵌func2中panic且func2做处理

    func main() {
        test1()
        time.Sleep(time.Second * 3)
        log.Println("123")
    }
    func test1() {
        log.Println("test1 start")
        test2()
        log.Println("test1 end")
    }
    func test2() {
        defer func() {
            if err := recover(); err != nil {
                log.Println("test2 err:", err)
            }
        }()
        log.Println("test2 start")
        panic(errors.New("stop test2"))
        log.Println("test2 end")
    }

    2.6 func1内嵌func中panic且func1做处理

    func main() {
        test1()
        time.Sleep(time.Second * 3)
        log.Println("123")
    }
    func test1() {
        defer func() {
            if err := recover(); err != nil {
                log.Println("test? err:", err)
            }
        }()
        log.Println("test1 start")
        test2()
        log.Println("test1 end")
    }
    func test2() {
        log.Println("test2 start")
        panic(errors.New("stop test2"))
        log.Println("test2 end")
    }

    func2异常,执行终止,向调用者func1抛出进而本身退出,func1得到异常,执行终止,本身退出时recover进行处理,从而保活了main

    到此这篇关于golang panic及处理机制的文章就介绍到这了,更多相关golang panic内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Golang捕获panic堆栈信息的讲解
    • Golang中异常处理机制详解
    • GoLang 逃逸分析的机制详解
    • 深入理解golang的异常处理机制
    上一篇:Go 语言中的死锁问题解决
    下一篇:Golang 定时器的终止与重置实现
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    golang panic及处理机制 golang,panic,及,处理,机制,