defer+recover错误回收 自定义错误
本文最后更新于201 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

defer+recover错误回收

示例:

程序中出现错误/恐慌后程序被中断无法执行

package main

import "fmt"

func main() {
    kkk()
    fmt.Println("上面函数已经成功执行")
}

func kkk() {
    num1 := 2
    num2 := 0
    num3 := num1 / num2
    fmt.Println(num3)
}

使用defer+recover错误回收处理:

func recover

func recover() interface{}

内建函数recover允许程序管理恐慌过程中的Go程。在defer的函数中,执行recover调用会取回传至panic调用的错误值,恢复正常执行,停止恐慌过程。若recover在defer的函数之外被调用,它将不会停止恐慌过程序列。在此情况下,或当该Go程不在恐慌过程中时,或提供给panic的实参为nil时,recover就会返回nil。

package main

import "fmt"

func main() {
    kkk()
    fmt.Println("上面函数已经成功执行")
}

func kkk() {
    defer func() { //defer+recover来捕获错误
        if err := recover(); err != nil {
            //调用recover来捕获错误
            fmt.Println("err是", err)
            fmt.Println("错误已被捕获")
        }
    }()
    num1 := 2
    num2 := 0
    num3 := num1 / num2
    fmt.Println(num3)
}

自定义错误

自定义错误使用到函数

func New

func New(text string) error

使用字符串创建一个错误,请类比fmt包的Errorf方法,差不多可以认为是New(fmt.Sprintf(...))。

package main

import (
    "errors"
    "fmt"
)

func main() {
    err := kkk()
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println("上面函数已经成功执行")
}

func kkk() (err error) {
    num1 := 2
    num2 := 0
    if num2 == 0 {
        return errors.New("除数不能为零")
    } else {
        num3 := num1 / num2
        fmt.Println(num3)
        return nil
    }
}

文末附加内容
上一篇
下一篇