zoukankan      html  css  js  c++  java
  • go语言之异常捕获

    1 什么是异常

    不按照我们期望执行的都可以称之为异常

    2 go语言中如何处理异常

    一种是程序发生异常时, 将异常信息反馈给使用者

    一种是程序发生异常时, 立刻退出终止程序继续运行

    我们可以通过panic来抛出异常。

    func t_defer3(){
    print("t_defer3 ")
    panic("t_defer3_error")
    }

    func main(){
    t_defer3()
    print("test end")

    }
    执行结果:

    t_defer3
    panic: t_defer3_error

    goroutine 1 [running]:
    main.t_defer3()
    D:/go_prj/src/test.go:46 +0x63
    main.main()
    D:/go_prj/src/test.go:50 +0x29

    但是发现在panic发生的时候,整个goroutine都退出了。比如最后的test end就没有被执行。我们既想抛出异常,又想让进程继续运行,那就只能去捕获异常。捕获异常就要用到recover

    func t_defer1(){
    defer func() {
    if r:=recover();r!=nil{
    print("error found ")
    fmt.Println(r)
    }
    }()
    panic(123)
    }


    func main(){
    t_defer1()
    print("test end")
    }
    执行结果

    123
    error found
    test end

    异常有几个注意点:

    1 同一个函数中, 多个panic异常, 只有第一个会被捕获

    2 defer和recover必须在panic抛出异常之前定义。如果defer和recover在panic后定义,则异常不能被捕获到

    3 panic异常会随着函数的调用栈向外传递

    1. 例如: A函数调用了B函数, B函数调用了C函数
    2.  如果在C函数中抛出了一个panic异常, 那么这个异常会一层一层的传递到B和A
    3.  也就是在B和A函数中也能捕获到这个异常

    比如下面的例子

    func t_defer1(){
    panic(123)
    }


    在main中也能捕获到t_defer1中的异常
    func main(){
    defer func() {
    if err:=recover();err != nil{
    fmt.Println(err)
    }
    }()
      t_defer1()
    }
  • 相关阅读:
    中产阶级_百度百科
    第二天--设置一个数据模型
    请大家支持珊瑚虫~~请大家帮帮soff~~
    Linux Socket学习(十二)
    Debian下调整时间
    Emacs 牵手 scim
    Linux Socket学习(十三)
    mplayer解码
    创建第一个Symfony工程
    页面的基本创建
  • 原文地址:https://www.cnblogs.com/zhanghongfeng/p/15302619.html
Copyright © 2011-2022 走看看