九、错误处理

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")
}
发布了92 篇原创文章 · 获赞 12 · 访问量 5681

猜你喜欢

转载自blog.csdn.net/weixin_45413603/article/details/104786867