如何向Sentry上报自定义Go错误类型以显示自定义类型名而非底层类型
问题原因
你当前的写法是将operationTimeoutError声明为error接口的衍生类型,实际赋值的errOperationTimeout底层是标准库的*errors.errorString结构体,Sentry采集错误类型时默认读取错误的底层具体实现类型,因此只会显示errorString而不会显示你自定义的类型名。
你当前的上报效果参考:
解决方案
方案1:自定义结构体实现error接口(最推荐)
这是Go官方推荐的自定义错误实现方式,既可以让Sentry正确识别类型,也兼容errors.As等标准库错误处理能力,代码示例如下:
import ( "errors" "github.com/getsentry/sentry-go" ) // 自定义错误结构体,类型名会被Sentry识别 type operationTimeoutError struct { message string } // 实现error接口必须的Error方法 func (e *operationTimeoutError) Error() string { return e.message } // 初始化全局超时错误实例 var ErrOperationTimeout error = &operationTimeoutError{message: "TIMEOUT"} func foo() { // 上报后Sentry会显示错误类型为 *operationTimeoutError sentry.CaptureException(ErrOperationTimeout) }
方案2:无需修改错误定义的临时适配方案
如果你暂时不想调整现有错误定义,也可以通过Sentry的事件回调强制修改错误类型展示:
func foo() { sentry.CaptureException(errOperationTimeout, func(event *sentry.Event) { // 强制修改第一个异常的类型名为自定义名称 if len(event.Exception) > 0 { event.Exception[0].Type = "operationTimeoutError" } }) }
内容的提问来源于stack exchange,提问作者diaa
相关产品推荐
相关产品推荐

