异常处理的综合示例

看一个综合示例,关键代码如下:

defer func() {
    r := recover()
    if r == nil {
        fmt.Println("没有异常,什么都不需要做,输出这个原因是因为函数结束前调用了defer! ")
        return
    }

    if err, ok := r.(error); ok {
        log.Println("记录错误发生,错误内容为:", err)
        //这里就可以模拟将错误信息发送给管理员
    //sendEmail2Admin(err)
    } else {
        panic(fmt.Sprintf("不是错误,recover的类型是: %v", r))
    }
}()

在defer代码块中,使用匿名函数来处理相应的逻辑。首先获取recover(),如果获取到的recover()为nil,说明没有异常,仅仅是函数结束前调用了defer栈中的代码。 因为recover()是接口类型,对它做接口类型断言r.(error),当它的类型为error时,输出这个错误的信息,并模拟发送邮件给管理员。如果不error类型时,则输出这个recover()的真正类型。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注