go异常recover()

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

今天在测试代码的时候一直报错!找了好久也不知道咋回事!

就一直网络异常

然后我师傅敲了上面这段代码,检查到了我的数组越界了!

然后我发现了我的逻辑错误!

于是乎!复习了一下go语言异常处理

 go异常处理

  首先 go语言不支持传统的try catch finally,所以go引入的处理方式是 defer, panic, recover

  这三个异常的使用场景未:

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

  使用defer+recover处理异常请看下面!

package main

import (
    "fmt"

)

func test(){
    //使用defer +recover 来捕获和异常处理
    defer func(){
        err :=recover()//recover()内置函数,可以捕获到异常
        if err!=nil {
            fmt.Println("err=",err)
            //这里可以将错误信息发送给管理员
            fmt.Println("发送邮件给xxx")
        }

    }()
    num1 :=10
    num2 :=0
    res :=num1/num2
    fmt.Println("res=",res)
}
func main(){
    //测试
    test()
}

 错误信息如下:

E:goprojectgo_testerrortest>go run error1.go
err= runtime error: integer divide by zero

  自定义错误

  go程序中,也支持自定义错误,使用errors.new和panic内置函数

  (1)errors.new("错误说明"),会返回一个error类型的值,表示一个错误

  (2)panic内置函数,接收一个interface{}类型的值作为参数,可以接收error类型的变量,输出错误信息,并退出程序

package main

import (
    "errors"
    "fmt"

)

func test(){
    //使用defer +recover 来捕获和异常处理
    defer func(){
        err :=recover()//recover()内置函数,可以捕获到异常
        if err!=nil {
            fmt.Println("err=",err)
            //这里可以将错误信息发送给管理员
            fmt.Println(" 发送邮件给xxx")
        }

    }()
    num1 :=10
    num2 :=0
    res :=num1/num2
    fmt.Println("res=",res)
}

func readConf(name string)(err error){
    if name =="config.ini"{
        //读取。。。
        return nil
    }else{
        //返回一个自定义错误
        return errors.New("读取文件错误")
    }
}

func test02(){

    err :=readConf("config2.ini")
    if err!=nil{
        //如果读取文件发送错误,就输出这个错误,并终止程序
        panic(err)
    }
    fmt.Println("test02()继续执行")
}

func main(){
    //测试
    //test()
    test02()
    fmt.Println("main()下面的到吗。。。")
}
原文地址:https://www.cnblogs.com/gagaAurora/p/13643826.html