看一个综合示例,关键代码如下:
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()
的真正类型。