Go 错误处理

在 Go 中如果遇到错误,该如何处理?可以看下最常见的除零异常:

num := 10
fmt.Println(num / 0)

可以发现,当我们直接运行上面的代码的时候,程序抛出了一个异常并且程序直接退出了

➜  go-learn go run error_handler.go
# command-line-arguments
./error_handler.go:9:20: invalid operation: division by zero

在程序中,我们往往会发生一些错误(panic),但是这些错误我们希望能够感知并处理,而不是直接将程序退出。

在 Go 语言中,不支持传统的 try...catch 这种处理方式,而是引入了:defer panic recover 来进行错误处理。

例如:在程序中可以抛出一个 panic 异常,然后在 defer 中通过 recover 去捕获这个异常进行处理。

func main() {
	test()
	fmt.Println("我来证明程序没有退出....")
}

func test() {
	defer func() {
		err := recover()
		if err != nil {
			fmt.Println("err =", err)
		}
	}()
	num := 10
	num2 := 0
	fmt.Println(num / num2)
}

错误处理后,可以让我们的程序更加健壮,如果在一些必要的流程,我们还可以加入预警代码,例如发生错误后将错误信息以邮件、短信等方式通知开发者处理。

自定义错误

在 Go 程序中,也可以自定义错误,使用 errors.Newpanic 内置函数。

  1. errors.New("错误说明") 会返回一个 error 类型的值,表示一个错误。
  2. panic 内置函数接收一个 interface {} 类型的值作为参数,也可以接收一个 error 类型的变量,他可以输出一个错误消息并推出程序。
func main() {
	fmt.Println("hello world")
	data, err := invoke()

	if err != nil {
		fmt.Println("即将抛出异常并推出程序")
		panic(err)
	}

	fmt.Println("数据是 ===>", data)
}

func invoke() (data string, err error) {
	err = throw_error("clove")
	if err != nil {
		return "错误", err
	}
	return "输入正确", nil
}

func throw_error(fileName string) (err error) {
	if fileName != "clover" {
		return errors.New("输入错误")
	}
	return nil
}
posted @ 2023-06-13 10:06  CloverYou  阅读(40)  评论(0)    收藏  举报