有时候我们可以需要从panic中恢复
下面这个函数中,如果某个异常出现,我们不会选择让解析器崩溃,而是将panic异常当作普通的解析错误,并附加额外消息提醒用户报告此错误
func Parse(input string) (s *Syntax, err error) {
defer func() {
if p := recover(); p != nil {
err = fmt.Errorf("internal error: %v", p)
}
}()
// ...parser...
}
我们观察上面的defer函数,p是recover的错误信息,我们将panic value添加到了err中
在panic后面,我们无法保证包级变量的状态仍然和我们预期一致。
我们遵守的规范是:不应该试图去回复其他包引起的panic,公用的API应该及那个函数的运行失败作为error返回
我们很难完全遵守规范,在net/http包中提供的web服务器,我们不应该因为一个handler函数的问题而终止整个gorouitne,这里我们需要使用recover
我们需要有选择性的recover
为了标识某个