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()
    }
  • 相关阅读:
    #import </usr/include/objc/objc-class.h> not such file or directory问题的解决方法
    关于二进制补码
    DirectSound的应用
    Qt on Android: http下载与Json解析
    双绞线的制作,T568A线序,T568B线序
    Java设计模式之从[暗黑破坏神存档点]分析备忘录(Memento)模式
    linux 系统升级中的一些配置
    malloc函数具体解释
    老鸟的Python新手教程
    ubuntu12.04 安装配置jdk1.7
  • 原文地址:https://www.cnblogs.com/zhanghongfeng/p/15302619.html
Copyright © 2011-2022 走看看