1. package main
  2. import "fmt"
  3. func test() {
  4. n1 := 100
  5. n2 := 0
  6. res := n1 / n2
  7. fmt.Println("res = ", res)
  8. }
  9. func main() {
  10. test()
  11. fmt.Println("接下来...")
  12. }

除法分母不能为0,上面test() 函数会报错,后面的代码会执行吗?

  1. panic: runtime error: integer divide by zero
  2. goroutine 1 [running]:
  3. main.test()
  4. D:/go-project/src/go_code/errordo/main/main.go:8 +0x11
  5. main.main()
  6. D:/go-project/src/go_code/errordo/main/main.go:12 +0x19
  7. exit status 2

panic

  1. 默认情况下,当发生panic,程序就会退出
  2. 希望发生错误后,捕获到错误,并处理,以保证程序可以正常运行,还可以再捕获错误后,通知相关人员(邮件、短信…)

    程序错误处理机制

    Go引入的错误处理方式: defer, panic, recover
    Go可以抛出一个panic的异常,然后再defer中通过recover捕获这个异常,并处理。

上面代码进行错误处理

  1. package main
  2. import "fmt"
  3. func test() {
  4. // defer + recover 捕获处理异常
  5. defer func() {
  6. err := recover() // recover内置函数,可以捕获异常
  7. if err != nil {
  8. // 有异常
  9. fmt.Println("err = ", err)
  10. // 做一些别的操作, 错误监控,通知工作人员等等
  11. }
  12. }()
  13. n1 := 100
  14. n2 := 0
  15. res := n1 / n2
  16. fmt.Println("res = ", res)
  17. }
  18. func main() {
  19. test()
  20. fmt.Println("接下来...")
  21. }

写法:

  1. defer func() {
  2. err := recover() // recover内置函数,可以捕获异常
  3. if err != nil {
  4. // 有异常
  5. fmt.Println("err = ", err)
  6. // 做一些别的操作, 错误监控,通知工作人员等等
  7. }
  8. }()
  1. defer func() {
  2. if err := recover(); err != nil {
  3. fmt.Println("err = ", err)
  4. }
  5. }()

自定义错误

使用 errors.New 和内置 panic 函数

  1. errors.New(“错误说明”) 会返回一个error类型的值,表示一个错误
  2. 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(“接下来…”)

  1. // 自定义错误测试
  2. test02()
  3. fmt.Println("test02...")

}

test02()后面的代码 test02…

```