package mainimport "fmt"func test() {n1 := 100n2 := 0res := n1 / n2fmt.Println("res = ", res)}func main() {test()fmt.Println("接下来...")}
除法分母不能为0,上面test() 函数会报错,后面的代码会执行吗?
panic: runtime error: integer divide by zerogoroutine 1 [running]:main.test()D:/go-project/src/go_code/errordo/main/main.go:8 +0x11main.main()D:/go-project/src/go_code/errordo/main/main.go:12 +0x19exit status 2
panic
- 默认情况下,当发生panic,程序就会退出
- 希望发生错误后,捕获到错误,并处理,以保证程序可以正常运行,还可以再捕获错误后,通知相关人员(邮件、短信…)
程序错误处理机制
Go引入的错误处理方式: defer, panic, recover
Go可以抛出一个panic的异常,然后再defer中通过recover捕获这个异常,并处理。
上面代码进行错误处理
package mainimport "fmt"func test() {// defer + recover 捕获处理异常defer func() {err := recover() // recover内置函数,可以捕获异常if err != nil {// 有异常fmt.Println("err = ", err)// 做一些别的操作, 错误监控,通知工作人员等等}}()n1 := 100n2 := 0res := n1 / n2fmt.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…
```
