go的错误处理

一 问题引出

1 代码

package main

import (
   "fmt"
   _ "time"
)

func test() {
   num1 := 10
   num2 := 0
   res := num1 / num2
   fmt.Println("res=", res)
}

func main() {
   // 测试
   test()
   fmt.Println("main()下面的代码...")
}

2 测试结果

panic: runtime error: integer divide by zero

goroutine 1 [running]:
main.test()
    E:/gocode/src/chapter06/error/main.go:20 +0x11
main.main()
    E:/gocode/src/chapter06/error/main.go:48 +0x29

3 分析

a 在默认情况下,当发生错误后(panic) ,程序就会退出。

b 我们希望当发生错误后,可以捕获到错误,并进行处理,保证程序可以继续执行。还可以在捕获到错误后,给管理员一个提示(例如:邮件,短信)。

c 于是引出错误处理机制。

二 基本说明

1 Go 语言追求简洁优雅,所以,Go 语言不支持传统的 try…catch…finally 这种处理。

2 Go 中引入的处理方式为:defer, panic, recover。

3 这几个异常的使用场景可以这么简单描述:Go 中可以抛出一个 panic 的异常,然后在 defer 中通过 recover 捕获这个异常,然后正常处理。

三 使用 defer+recover 来处理错误

1 代码

package main

import (
   "fmt"
   "time"
   _ "time"
)

func test() {
   // 使用defer + recover 来捕获和处理异常
   defer func() {
      err := recover() // recover()内置函数:可以捕获到异常
      if err != nil {  // 说明捕获到错误
         fmt.Println("err=", err)
         // 这里可以将错误信息发送给管理员....
         fmt.Println("发送邮件给admin@sohu.com")
      }
   }()
   num1 := 10
   num2 := 0
   res := num1 / num2
   fmt.Println("res=", res)
}

func main() {
   // 测试
   test()
   for {
      fmt.Println("main()下面的代码...")
      time.Sleep(time.Second)
   }
}

2 测试

err= runtime error: integer divide by zero
发送邮件给admin@sohu.com
main()下面的代码...
main()下面的代码...
main()下面的代码...
main()下面的代码...
main()下面的代码...

3 说明

进行错误处理后,程序不会轻易挂掉,如果加入预警代码,就可以让程序更加的健壮。

四 自定义错误介绍

Go 程序中,也支持自定义错误, 使用 errors.New 和 panic 内置函数。

1 errors.New("错误说明") , 会返回一个 error 类型的值,表示一个错误。

2 panic 内置函数,接收一个 interface{} 类型的值作为参数。可以接收 error 类型的变量,输出错误信息,并退出程序。

五 自定义错误实战

1 代码

package main

import (
   "errors"
   "fmt"
   _ "time"
)

// 函数去读取配置文件init.conf的信息
// 如果文件名传入不正确,就返回一个自定义的错误
func readConf(name string) (err error) {
   if name == "config.ini" {
      // 读取...
      return nil
   } else {
      // 返回一个自定义错误
      return errors.New("读取文件错误..")
   }
}

func test02() {
   err := readConf("config2.ini")
   if err != nil {
      // 如果读取文件发送错误,就输出这个错误,并终止程序
      panic(err)
   }
   fmt.Println("test02()继续执行....")
}

func main() {
   // 测试自定义错误的使用
   test02()
   fmt.Println("main()下面的代码...")
}

2 测试

panic: 读取文件错误..

goroutine 1 [running]:
main.test02()
    E:/gocode/src/chapter06/error/main.go:41 +0xff
main.main()
    E:/gocode/src/chapter06/error/main.go:55 +0x29

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值