如何实现栈错误追踪?Wrap数据库错误时追踪失效的问题
栈错误追踪实现问题
我正尝试实现栈错误追踪,目前遇到了一个矛盾的问题:
情况一:直接Wrap数据库错误
以下代码能捕获数据库错误,但无法触发追踪:
// err 是 *db.Error 类型 if err != nil { return nil, errors.Wrap(err, "error msg") } // 错误中间件中的代码: func traceError(err error) { _, ok := err.(stackTracer) if ok { fmt.Print("tracer implemented") } else { fmt.Print("tracer not implemented") } } switch e := errors.Cause(err).(type) { case *db.Error: fmt.Print("caught db error") traceError(err) default: fmt.Print("unknown error") traceError(err) }
输出结果:
caught db error tracer not implemented
情况二:先新建错误再Wrap
当我先创建新错误再执行Wrap时,追踪功能正常触发,但错误会被识别为未知错误:
// err 是 *db.Error 类型 if err != nil { newError := errors.New(err.Error()) return nil, errors.Wrap(newError, "error msg") }
输出结果:
unknown error tracer implemented
期望输出
我想要的理想输出是:
caught db error tracer implemented
补充说明:重新检查后发现代码本身没有问题,问题可能出在代码其他部分的疏漏。
内容的提问来源于stack exchange,提问作者Bhojendra Rauniyar
相关产品推荐
相关产品推荐

