错误处理函数:defer、panic、recover、errors

  1. 在默认情况下,当发生错误(panic)后,程序就会终止运行
  2. 如果发生错误后,可以捕获错误,并通知管理人员(邮件或者短信),程序还可以继续运行,这当然无可厚非
  3. errors.New("错误信息"),会返回一个error类型的值,表示一个错误
  4. panic内置函数,接收一个interface()类型的值(也就是任何值都可以)作为参数,可以接收error类型的变量,输出错误信息,并退出程序
  5. GO语言追求简洁优雅,GO语言不支持类似php、java的try... catch...操作
  6. GO语言中引入的处理方式为:defer、panic、recover
  7. GO可以抛出一个panic异常。然后在defer中通过recover捕获异常再处理


errors.New

package main
import (
"fmt"
"errors"
)


//此函数读取配置文件信息
//如果文件名不正确,返回自定义错误
func readConfFile(FileName string) (err error) { //返回error类型
if FileName == "config.ini" {
return nil //表示没有错误
} else {
return errors.New("读取文件错误")
}
}

func error_func(){
err := readConfFile("config.ini") //这里故意写错,报错代码在第一块,如果写对,在第二块
if err != nil {
//如果读取文件发生错误,就输出这个错误,并终止程序
panic(err) //这个函数作用是打印错误信息,并终止程序
}
fmt.Println("error_func()继续执行")
}
func main() {
error_func()
fmt.Printf("发生错误后面的代码")
}



//【报错信息】
//一、
// panic: 读取文件错误

// goroutine 1 [running]:
// main.error_func()
// D:/goproject/src/main/hello.go:22 +0xdf
// main.main()
// D:/goproject/src/main/hello.go:27 +0x27
// exit status 2


//二、
// error_func()继续执行
// 发生错误后面的代码


defer + recover()


package main
import (
"fmt"
"time"
)



//这里举例,在数学计算中0是不可以作为被除数的
func error_func() {
//这里使用defer + recover来捕获处理异常
defer func() { //defer就是把匿名函数压入到defer栈中,等到执行完毕后或者发生异常后调用匿名函数
err := recover() //recover是内置函数,可以捕获到异常
if err != nil { //说明有错误
fmt.Println("err=", err)
//当然这里可以把错误的详细位置发送给开发人员
//send email to admin
}
}()
num1 := 10
num2 := 0
res := num1 / num2
fmt.Println("res=", res)
}

func main() {
//这样程序不会轻易挂掉
error_func()
i := 0
for {
i++
fmt.Println("发生错误后面的代码", i)
time.Sleep(time.Second)
}

}



package main
import (
"fmt"
"errors"
)


func foo()(n int) {
defer func() {
if r := recover(); r != nil {
fmt.Println("再然后④\n")
n++
fmt.Println("最后⑤\n")
}
}()
fmt.Println("首先①\n")
n++
fmt.Printf("然后②n=%v\n" ,n)
fmt.Println("然后③\n")
panic(errors.New("i'm a bug"))
fmt.Println("没走\n")

return n
}
func main() {
n := foo()
fmt.Printf("n最后的值%v", n)
}