Go Lang 异常处理

C#,JAVA等语言通过try...catch...finally实现错误的捕获和处理
Go Lang异常处理的设计思想中主张
  • 如果一个函数可能出现异常,那么应该把异常作为返回值,没有异常就返回 nil
  • 每次调用可能出现异常的函数时,都应该主动进行检查,并做出反应,这种 if 卫述语句
所以异常应该总是掌握在我们的手上,保证每次操作产生的影响达到最小,保证程序即使部分地方出现问题,也不会影响整个程序的运行,及时的处理异常,这样就可以减轻上层处理异常的压力。同时也不要让未知的异常使你的程序崩溃。
 
Go Lang推荐的异常捕获常用到的一些内置函数大抵是:
panic:主动抛出异常
recover: 捕获异常,只有在 defer 函数中使用 recover,才能捕获 panic 异常
defer:defer是go中一种延迟调用机制,defer后面的函数只有在当前函数执行完毕后才能执行,将延迟的语句按defer的逆序进行执行,也就是说先被defer的语句最后被执行,最后被defer的语句,最先被执行,通常用于释放资源。
errors:定义异常信息
fmt.Errorf:定义异常信息
nil:nil 是一个预定义的标识符,在不同的上下文环境中有不同的含义,但通常表示“无”、“空”或“零值”。 nil 可以赋值给指针、切片、map、通道、函数以及接口类型的变量
 
模拟一下常用的try..catch
    defer func(){
        err:=recover()
        fmt.Println(err)
    }()

    panic("this is an error")
我自己的理解是,相当于先定义了catch的方法,后面抛出的异常都将被defer中的recover捕获,然后打印出来
 
那么如果是某一个被调用的函数中有异常又会发生什么?


func throwException(){
    panic("this is an error")
}

func main() {

    defer func(){
        err:=recover()
        fmt.Println(err)
    }()

    throwException()
    // panic("this is an error")

    }
throwException中的异常依旧会被捕获
 
上面的代码会有一个问题,就是不论有没有异常,fmt.Println(err)都会被执行,这时候需要引入nil关键字
就如它的定义,它代表着0值,这里err!=nil 说明的是err有被赋值也就是有被捕获到错误


func throwException(){
    // panic("this is an error")
    fmt.Println("there is no error")
}

func main() {

    defer func(){
        err:=recover()
        if err!=nil{
            fmt.Println(err)
        }
    }()

    throwException()
    // panic("this is an error")

    }
 


func throwException(){
    panic("this is an error")
    // fmt.Println("there is no error")
}

func main() {

    defer func(){
        err:=recover()
        if err!=nil{
            fmt.Println(err)
        }
    }()

    throwException()
    // panic("this is an error")

    }
可以对比上面两个代码的执行结果
这样try..catch的方式就被实现了
下面介绍的是推荐的写法,就是把error放在返回值中带出来,这样就可以直接获取异常,不用在外部再获取错误


func throwException() (res error) {
    
    defer func(){
        err:=recover()
        if err!=nil{
            fmt.Println(err)
            res=fmt.Errorf("throw exception");
        }
    }()

    panic("this is an error")
    return
    // fmt.Println("there is no error")
}

func main() {

    defer func(){
        err:=recover()
        if err!=nil{
            fmt.Println(err)
        }
    }()

    res := throwException()
    fmt.Println(res)
    // panic("this is an error")

    }
 
以上就是Go Lang的异常处理
posted @ 2024-01-14 23:31  Terry841119  阅读(49)  评论(0)    收藏  举报