package router import ( "errors" "runtime/debug" ) // StackError 保存原始错误和堆栈 type StackError struct { err error stack string } // 实现 error 接口 func (s *StackError) Error() string { if s.err == nil { return "" } return s.err.Error() } // StackTrace 返回堆栈信息 func (s *StackError) StackTrace() string { return s.stack } // WrapWithStack 给错误附加堆栈,如果已经是 StackError 则直接返回 func WrapWithStack(err error) *StackError { if err == nil { return nil } var se *StackError if errors.As(err, &se) { return se } return &StackError{ err: err, stack: string(debug.Stack()), } }