Go 语言中的错误处理机制
一、错误处理机制引出
- 在默认情况下,当发生错误后(panic) ,程序就会退出(崩溃.)
- 如果我们希望:当发生错误后,可以捕获到错误,并进行处理,保证程序可以继续执行。还可以在捕获到错误后,给管理员一个提示(邮件,短信。。。)
- 这里引出我们要将的错误处理机制
二、说明
- Go 语言追求简洁优雅,所以,Go 语言不支持传统的 try…catch…finally 这种处理。
- Go 中引入的处理方式为:****defer****, ****panic****, ****recover****
- 这几个异常的使用场景可以这么简单描述:Go 中可以抛出一个 panic 的异常,然后在 defer 中通过 recover 捕获这个异常,然后正常处理
三、使用defer+recover 来处理错误
package main
import (
"fmt"
"time"
)
func test(){
//使用defer + recover来捕获和处理异常
defer func(){
err := recover() // recover()是go内置函数,可以捕获到异常
if err != nil { //err 不为空
fmt.Println("err=", err)
}
}()//匿名函数
num1 := 10
num2 := 0
res := num1/num2 //这句会报错,
fmt.Println("res=", res)
}
func main(){
test()
for i:=0;i<3;i++{
fmt.Println("main()下面的代码...")
time.Sleep(time.Second)
}
}
四、自定义错误
Go 程序中,也支持自定义错误, 使用 errors.New 和 panic 内置函数。
- errors.New("错误说明") , 会返回一个 error 类型的值,表示一个错误
- panic 内置函数 ,接收一个 interface{}类型的值(也就是任何值了)作为参数。可以接收 error 类型的变量,****输出错误信息****,****并退出程序****.
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 test() {
err := readConf("config2.ini")
if err != nil {
//如果读取文件发生错误,则err不为空(nil),并终止程序
panic(err)
}
fmt.Println("test()继续执行...")
}
func main() {
test()
for i := 0; i < 3; i++ {
fmt.Println("main()下面的代码...")
time.Sleep(time.Second)
}
}