异常处理 - Go 学习记录

Go 错误处理 Panic 和 Recover

  1. Go中没有错误机制
  2. error 类型实现了 error 接口
    type error interface {
        Error() string
    }
  3. 可以通过 errors.New 来实现快速创建错误信息
    errors.New("这是一条错误提示")

Panic 的基本定义和使用

  1. panic 用于不可以恢复的错误
  2. Panic 退出前会执行 defer 指定的内容、
    func TestPanic(t *testing.T) {
        defer func() {
            fmt.Println("最后结果依旧执行!") // 这一部分的代码依旧执行
        }()
        fmt.Println("执行开始")
        panic(errors.New("错误信息!"))
    }
    // 输出大致结果如下
    开始
    最后结果依旧执行!
    --- FAIL: TestPanic (0.00s)
    panic: 错误信息! [recovered]
    panic: 错误信息!

os.Exit 的基本定义和使用

  1. os.Exit 退出时不调用defer 指定的函数
  2. os.Exit 退出时不输出当前调用栈信息
    func TestExit(t *testing.T) {
        defer func() {
            fmt.Println("这段代码不会执行!") 
        }()
        fmt.Println("开始执行")
        os.Exit(-1) // 直接退出 exit status 255
    }
    // 输出结果如下
    开始执行
    exit status 255

Recover 的使用

  1. 如果在 defer 中使用了 recover() 函数,则会捕获错误信息,使该错误信息终止报告。
    func TestRecover(t *testing.T) {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("recoverd 开始\n", err)
        }
    }()
    fmt.Println("开始执行")
    panic(errors.New("错误信息!"))
    }
    // 输出结果如下:
    开始执行
    recoverd 开始
    错误信息!

    异常处理总结

    当一个函数在执行过程中出现了异常或遇到 panic(),正常语句就会立即终止,
    然后执行 defer 语句,再报告异常信息,最后退出。
    如果在 defer 中使用了 recover() 函数,则会捕获错误信息,使该错误信息终止报告。

学习记录同步的练习代码移步 GitHub

高永立

Ali
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!