1.error 接口
Go 语言通过 error 接口实现错误处理的标准模式,通过使用函数返回值列表中的最后一个
值返回错误信息,将错误的处理交由程序员主动进行处理
package main
import (
"errors"
"fmt"
)
//返回值 怎么定义错误类型error
//怎么创建错误类型的值,errors.New(),fmt.Errorf() 生成一个错误对象
//无错误nil
func division(a, b int) (int, error) {
if b == 0 {
return -1, errors.New("division is zero ")
}
return a / b, nil
}
func main() {
fmt.Println(division(1, 2))
if v, err := division(1, 0); err == nil {
fmt.Println(v)
} else {
fmt.Println(err)
}
e := fmt.Errorf("Error: %s", "division is zero")
fmt.Printf("%T,%v \n", e, e)
}
2. defer
defer 关键字用户声明函数,不论函数是否发生错误都在函数执行最后执行(return 之前),
若使用 defer 声明多个函数,则按照声明的顺序,先声明后执行(堆)
常用来做资源释放,记录日志等工作
package main
import "fmt"
func main() {
//defer 延迟执行
//在函数退出的时候执行而且符合堆栈 先进后出
defer func() {
fmt.Println("defer is 01")
}()
defer func() {
fmt.Println("defer is 02")
}()
fmt.Println("is ok")
}
3.panic 与 recover 函数
go 语言提供 panic 和 recover 函数用于处理运行时错误,当调用 panic 抛出错误,中断原 有的控制流程,常用于不可修复性错误。recover 函数用于终止错误处理流程,仅在 defer
语句的函数中有效,用于截取错误处理流程,recover 只能捕获到最后一个错误
package main
import "fmt"
//适用于 别人使用了panic 你想主动的抓取错误信息,通过error信息返回 就可以使用这种方法
//用第三方库想抓取错误信息 一般使用这种方式
func test() (err error) {
defer func() {
if e := recover(); e != nil {
err = fmt.Errorf("%v", e)
}
}()
panic("error:no ok")
return
}
func main() {
err := test()
fmt.Println(err)
//panic 抛出异常直接退出
//recover 是有错误的时候抛出错误或者做修复使用,会接受panic的错误并抛出
defer func() {
if err := recover(); err != nil {
fmt.Printf("%T %v", err, err)
}
}()
fmt.Println("start")
panic("error")
fmt.Println("stop")
}