一、err错误
在默认情况下,发生错误,程序会退出
package main
import (
"fmt"
)
func test() {
num1 := 10
num2 := 0
res := num1 / num2
fmt.Printf("res的值是%v", res)
}
func main() {
test()
fmt.Println("main()下面的代码。。。")//不执行
}
PS D:\goproject\src\go_code\chaptor6\error> go run .\main.go
panic: runtime error: integer divide by zero
goroutine 1 [running]:
main.test()
D:/goproject/src/go_code/chaptor6/error/main.go:10 +0x11
main.main()
D:/goproject/src/go_code/chaptor6/error/main.go:16 +0x19
exit status 2
二、错误处理
1、go不支持try…catch…finally这种处理;
2、go中引入的处理方式为:defer、panic、recover;
3、go中可以抛出一个panic异常,然后在defer中通过recover捕获这个异常,然后正常处理。
package main
import (
"fmt"
)
func test() {
//defer + recover 来捕获和处理异常
defer func(){ //匿名函数
err := recover() //recover()内置函数,可以捕获异常
if err != nil { //nil是err的初始值,如果不等于说明捕获到错误
fmt.Println("err=", err)
}
}() //匿名函数的调用
num1 := 10
num2 := 0
res := num1 / num2
fmt.Printf("res的值是%v", res)
}
func main() {
test()
fmt.Println("main()下面的代码。。。")//继续执行
}
输出
PS D:\goproject\src\go_code\chaptor6\error> go run .\main.go
err= runtime error: integer divide by zero
main()下面的代码。。。
三、自定义错误
使用errors.New和panic内置函数
1、errors.New(“错误说明”),会返回一个error类型的值,表示一个错误;
2、panic内置函数,接收一个interface{}类型的值(任何值)作为参数。可以接收error类型的变量,输出错误信息,并退出函数。
func readConf(name string) (err error) {
if name == "config.ini" {
//读取
return nil
}else {
//返回一个自定义错误
return errors.New("读取文件错误。。")
}
}
func test02() {
err := readConf("config2.ini") //如果传入config.ini,则无错误返回
if err != nil {
//如果读取文件发送错误,就输出这个错误,并终止程序
panic(err)
}
fmt.Println("test2()继续执行。。。") //错误不执行
}
输出
PS D:\goproject\src\go_code\chaptor6\error> go run .\main.go
panic: 读取文件错误。。
goroutine 1 [running]:
main.test02()
D:/goproject/src/go_code/chaptor6/error/main.go:36 +0x49
main.main()
D:/goproject/src/go_code/chaptor6/error/main.go:47 +0x17
exit status 2