Go语言_错误处理
错误处理机制
在默认情况下,当发生错误后,程序就会退出。
Go中错误处理方式为:defer、panic、recover,机制为:
Go中可以抛出一个panic异常,然后在defer中通过recover捕获这个异常,最后进行处理
defer+recover方式
package main
import "fmt"
func div(num1 int, num2 int) int {
defer func() { // 定义匿名函数
err := recover() // 通过内置函数revocer()捕获异常
if err != nil {
fmt.Println("err= ", err)
}
}() // 没有参数
res := num1 / num2 // 除0异常
fmt.Println("计算完成")
return res
}
func main() {
var num1 int = 10
var num2 int = 0
div(num1, num2)
fmt.Println("程序结束")
}
分析:
-
当调用test函数,程序执行到defer定义的匿名函数时,会将该函数压入栈中;
-
执行到
res := num1 / num2
时产生异常,程序需要退出,此时,将执行defer存入栈中的代码; -
内置函数recover()会捕获到异常信息,当异常信息不为nil时,输出异常信息;
-
剩余的代码正常执行。
注意事项:
- 通过defer和recover捕获异常需要将匿名函数定义在可能发生异常的代码之前,否则还没有执行到defer的位置程序已经发生错误并停止。
自定义错误
Go中通过errors.New
和panic
内置函数实现自定义错误
errors.New("错误说明")
,会返回一个error
类型的值,表示一个错误,需要引入errors
包panic
内置函数接收一个interface{}
(空接口)类型的值作为参数,可以接收error
类型的变量,输出错误消息并退出程序。
panic()可以接收任何类型数据,并打印出来,然后退出程序。
package main
import (
"errors"
"fmt"
)
func readConf(name string) (err error) { // 返回一个error类型数据
if name == "config.json" {
return nil
} else {
return errors.New("文件读取错误") // 自定义错误信息
}
}
func test02() {
err := readConf("config.json")
if err != nil {
panic(err) // 通过panic输出错误信息并退出程序
}
fmt.Println("继续执行")
}
func main() {
test02()
}