EllanJiang/GameFramework · error · GameFrameworkException

UI group ' ' not exists specified UI form '[ ] '.

Error message

UI group '{0}' not exists specified UI form '[{1}]{2}'.

What it means

During RemoveUIForm, after locating the UIFormInfo the library removes it from the group's internal linked list. If the removal fails it throws GameFrameworkException naming the group and the form '[serialId]assetName', an internal-inconsistency signal: the info existed for lookup but not for removal.

Solutions

  1. Remove duplicate/re-entrant CloseUIForm calls for the same form
  2. Never call CloseUIForm on a form from inside its own OnClose/OnCover callbacks; defer with a flag or next-frame mechanism
  3. Verify all UI operations stay on the main thread

Example fix

// before
void OnCloseClicked()
{
    uiGroup.CloseUIForm(this);       // inside form callback
    uiGroup.CloseUIForm(this);       // duplicate close
}
// after
void OnCloseClicked()
{
    if (m_CloseRequested) return;
    m_CloseRequested = true;
    uiGroup.CloseUIForm(this);
}
Defensive patterns

Strategy: try-catch

Validate before calling

if (m_ClosingForms.Contains(uiForm.SerialId)) return; m_ClosingForms.Add(uiForm.SerialId);

Type guard

bool NotAlreadyClosing(int serialId) => !m_ClosingForms.Contains(serialId);

Try / catch

try { uiGroup.CloseUIForm(uiForm); } catch (GameFrameworkException ex) { Log.Error($"UI form list inconsistency: {ex.Message}"); }

Prevention

When it happens

Trigger: A form's UIFormInfo disappears from m_UIFormInfos between lookup and removal — e.g. re-entrant CloseUIForm calls on the same form from within UI lifecycle callbacks (OnClose/OnCover) or another thread.

Common situations: Closing the same form twice in one frame (once from a button handler, once from logic); CloseUIForm triggered inside the form's own close/cover callbacks; concurrent close calls without main-thread confinement.

Understand the failure class

Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.

Related errors


AI-assisted analysis of EllanJiang/GameFramework@d0c010b051 (2026-09-15). Data as JSON: /api/errors/c3081ceb0cf2144d. Report an issue: GitHub.

Appendix: source

Thrown at GameFramework/UI/UIManager.UIGroup.cs:367

                {
                    uiFormInfo.Covered = true;
                    uiForm.OnCover();
                }

                if (!uiFormInfo.Paused)
                {
                    uiFormInfo.Paused = true;
                    uiForm.OnPause();
                }

                if (m_CachedNode != null && m_CachedNode.Value.UIForm == uiForm)
                {
                    m_CachedNode = m_CachedNode.Next;
                }

                if (!m_UIFormInfos.Remove(uiFormInfo))
                {
                    throw new GameFrameworkException(Utility.Text.Format("UI group '{0}' not exists specified UI form '[{1}]{2}'.", m_Name, uiForm.SerialId, uiForm.UIFormAssetName));
                }

                ReferencePool.Release(uiFormInfo);
            }

            /// <summary>
            /// 激活界面。
            /// </summary>
            /// <param name="uiForm">要激活的界面。</param>
            /// <param name="userData">用户自定义数据。</param>
            public void RefocusUIForm(IUIForm uiForm, object userData)
            {
                UIFormInfo uiFormInfo = GetUIFormInfo(uiForm);
                if (uiFormInfo == null)
                {
                    throw new GameFrameworkException("Can not find UI form info.");
                }

View on GitHub (pinned to d0c010b051)