package main
import "fmt"
func test() {
n1 := 100
n2 := 0
res := n1 / n2
fmt.Println("res = ", res)
}
func main() {
test()
fmt.Println("接下来...")
}
除法分母不能为0,上面test() 函数会报错,后面的代码会执行吗?
panic: runtime error: integer divide by zero
goroutine 1 [running]:
main.test()
D:/go-project/src/go_code/errordo/main/main.go:8 +0x11
main.main()
D:/go-project/src/go_code/errordo/main/main.go:12 +0x19
exit status 2
panic
- 默认情况下,当发生panic,程序就会退出
- 希望发生错误后,捕获到错误,并处理,以保证程序可以正常运行,还可以再捕获错误后,通知相关人员(邮件、短信…)
程序错误处理机制
Go引入的错误处理方式: defer, panic, recover
Go可以抛出一个panic的异常,然后再defer中通过recover捕获这个异常,并处理。
上面代码进行错误处理
package main
import "fmt"
func test() {
// defer + recover 捕获处理异常
defer func() {
err := recover() // recover内置函数,可以捕获异常
if err != nil {
// 有异常
fmt.Println("err = ", err)
// 做一些别的操作, 错误监控,通知工作人员等等
}
}()
n1 := 100
n2 := 0
res := n1 / n2
fmt.Println("res = ", res)
}
func main() {
test()
fmt.Println("接下来...")
}
写法:
defer func() {
err := recover() // recover内置函数,可以捕获异常
if err != nil {
// 有异常
fmt.Println("err = ", err)
// 做一些别的操作, 错误监控,通知工作人员等等
}
}()
defer func() {
if err := recover(); err != nil {
fmt.Println("err = ", err)
}
}()
自定义错误
使用 errors.New 和内置 panic 函数
- errors.New(“错误说明”) 会返回一个error类型的值,表示一个错误
- panic内置函数,接收一个 interface{} 类型的值(也就是任何值)作为参数,可以接收error类型的变量,输出错误信息,并退出程序。 ```javascript import ( “errors” “fmt” )
// 自定义错误 func readConf(name string) (err error) { if name == “config.ini” { // 读取 return nil } else { // 返回错误 return errors.New(“读取文件错误”) } }
func test02() { err := readConf(“config.ini”) if err != nil { // 如果读取错误,就输出错误信息,并退出程序 panic(err) } fmt.Println(“test02()后面的代码”) }
func main() { // test() // fmt.Println(“接下来…”)
// 自定义错误测试
test02()
fmt.Println("test02...")
}
test02()后面的代码 test02…
```