1.1.1. 一、go语言的异常处理说明:

1、Go 语言不支持传统的 try…catch…finally 这种处理。

2、Go语言异常处理的方式为:defer, panic, recover。可以抛出一个 panic 的异常,然后在 defer 中通过 recover 捕获这个异常,然后正常处理。

  • 示例如下:
func test() {
    // defer 延迟语句。函数执行完之后再执行。
    //  err := recover() 捕获异常赋值给err变量
    defer func() {
        err := recover()
        if err != nil { //说明捕获到错误
            fmt.Println("错误=",err)
        }
    }()
    num2 := 0
    res := 10 / num2 //除零异常

    //程序异常之后。不执行这个。但是defer语句还是得执行。
    fmt.Println("结果=",res)
}
func main() {
    test()
    fmt.Println("程序结束 ...")
}
  • 输出结果:

错误= runtime error: integer divide by zero

程序结束 ...

说明:

  1. 程序除零异常之后。并不会执行异常之后的语句。但是会执行defer语句。
  2. 使用recover() 捕获异常赋值给err变量。之后就可以处理异常了。就是使用defer和 recover()来处理异常。
  3. 错误处理完成后。test()方法正常返回。继续执行main()里面的代码。

1.1.2. 二、自定义错误。

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

  1. errors.New("错误说明") , 会返回一个 error 类型的值,表示一个错误。
  2. panic 内置函数 ,接收一个 interface{}类型的值(也就是任何值了)作为参数。可以接收 error 类型的变量,打印错误的堆栈信息,并退出程序。

例子如下:使用panic(err) 打印错误的堆栈信息,并且终止程序;使用errors.New("参数值不是123") 创建一个错误。

func validParam(str string) error {
    if str == "123" {
        return nil
    }else {
        return errors.New("参数值不是123")
    }
}

func test()  {
    err := validParam("abc")
    if err != nil {
        fmt.Println("错误=",err) //错误= 参数值不是123
        panic(err) //打印错误的堆栈信息,并且终止程序
        fmt.Println("panic后的代码。。。")
    }

}

func main() {
    test()
    fmt.Println("main 函数的其他代码。。。")
}

结果如下:“panic: 参数值不是123 ” 以及后面的输出都是panic()函数打印的。

错误= 参数值不是123

panic: 参数值不是123

goroutine 1 [running]:

main.test()

G:/GitRepository/wkcom/goWorksp/Hello/src/errorDemo/demo2/main.go:20 +0x147

main.main()

G:/GitRepository/wkcom/goWorksp/Hello/src/errorDemo/demo2/main.go:29 +0x29

results matching ""

    No results matching ""