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
程序结束 ...
说明:
- 程序除零异常之后。并不会执行异常之后的语句。但是会执行defer语句。
- 使用recover() 捕获异常赋值给err变量。之后就可以处理异常了。就是使用defer和 recover()来处理异常。
- 错误处理完成后。test()方法正常返回。继续执行main()里面的代码。
1.1.2. 二、自定义错误。
Go 程序中,也支持自定义错误, 使用 errors.New 和 panic 内置函数。
- errors.New("错误说明") , 会返回一个 error 类型的值,表示一个错误。
- 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