由于项目原因,需要添加自定义error包,于是乎就有了这篇文章的思考。
首先明确,我们需要:
1、错误带有明确的标识,方便外部判断该错误是否是指定错误。
2、错误应该在产生的时候带有堆栈,方便在写入日志后可以快速定位整个调用链。
3、错误不应该占用太多的资源(cpu,memory等)。
基于以上三点,我进行了一番思考:
1、带标识,可以加个code(类型int)这样子就可以标识某种错误类型。
2、在用户new错误时候应该把当前堆栈记录下来,以便后面日志记录。
3、这个就看数据结构和算法的设计了(我不太擅长哈哈哈哈)。
实施:
首先应该提供以下对外接口
New(msg string)error. 生产错误
Attach(err error, msg string). 基于原有错误添加附带信息
Is(err error, code int) 判断错误是否某个类型错误
看起来应该满足需求了,然后开始编码
// 定义结构
type MyErr struct {
code int
msg string
*stack
}
func New(msg string, code int)error{
return &MyErr{
code:code,
msg:msg,
stack :caller(),
}
}
func Attach(err error, msg string) error{
if merr, ok := err.(*MyErr);ok {
return New(merr.msg+"#"+ msg, merr.code)
}
return New(err.Error()+"#"+msg, 0)
}
func Is(err error, code int)bool{
if merr, ok := err.(*MyErr);ok {
return merr.code == code
}
return false
}