{"record":{"id":"2a270af7830b3c5a","repo":"EllanJiang/GameFramework","slug":"unload-scene-success-callback-is-invalid","errorCode":null,"errorMessage":"Unload scene success callback is invalid.","messagePattern":"Unload scene success callback is invalid\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"error","filePath":"GameFramework/Resource/UnloadSceneCallbacks.cs","lineNumber":36,"sourceCode":"        /// <summary>\n        /// 初始化卸载场景回调函数集的新实例。\n        /// </summary>\n        /// <param name=\"unloadSceneSuccessCallback\">卸载场景成功回调函数。</param>\n        public UnloadSceneCallbacks(UnloadSceneSuccessCallback unloadSceneSuccessCallback)\n            : this(unloadSceneSuccessCallback, null)\n        {\n        }\n\n        /// <summary>\n        /// 初始化卸载场景回调函数集的新实例。\n        /// </summary>\n        /// <param name=\"unloadSceneSuccessCallback\">卸载场景成功回调函数。</param>\n        /// <param name=\"unloadSceneFailureCallback\">卸载场景失败回调函数。</param>\n        public UnloadSceneCallbacks(UnloadSceneSuccessCallback unloadSceneSuccessCallback, UnloadSceneFailureCallback unloadSceneFailureCallback)\n        {\n            if (unloadSceneSuccessCallback == null)\n            {\n                throw new GameFrameworkException(\"Unload scene success callback is invalid.\");\n            }\n\n            m_UnloadSceneSuccessCallback = unloadSceneSuccessCallback;\n            m_UnloadSceneFailureCallback = unloadSceneFailureCallback;\n        }\n\n        /// <summary>\n        /// 获取卸载场景成功回调函数。\n        /// </summary>\n        public UnloadSceneSuccessCallback UnloadSceneSuccessCallback\n        {\n            get\n            {\n                return m_UnloadSceneSuccessCallback;\n            }\n        }\n\n        /// <summary>","sourceCodeStart":18,"sourceCodeEnd":54,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/Resource/UnloadSceneCallbacks.cs#L18-L54","documentation":"The UnloadSceneCallbacks constructor requires a non-null unload-scene success callback; the failure callback may be omitted but the success callback is mandatory. Passing null means the framework could not notify the caller when a scene finishes unloading, so it throws immediately. This is a fail-fast argument check.","triggerScenarios":"Constructing UnloadSceneCallbacks with null for the unloadSceneSuccessCallback parameter, e.g. when passing callbacks to ResourceManager's UnloadScene API.","commonSituations":"Passing an uninitialized delegate/method-group reference, a conditional callback that was never assigned, or copying callback-creation code and leaving the success handler out.","solutions":["Provide a valid UnloadSceneSuccessCallback delegate to the constructor","Check that the method assigned to the success callback is not conditionally null","Only construct UnloadSceneCallbacks after the handler is assigned"],"exampleFix":"// before\nnew UnloadSceneCallbacks(null, OnUnloadSceneFailure);\n// after\nnew UnloadSceneCallbacks(OnUnloadSceneSuccess, OnUnloadSceneFailure);","handlingStrategy":"validation","validationCode":"if (onSuccess == null) { Log.Error(\"Unload scene success callback required\"); return; }","typeGuard":"bool HasSuccessCallback(UnloadSceneSuccessCallback cb) => cb != null;","tryCatchPattern":"try { var cbs = new UnloadSceneCallbacks(onSuccess, onFailure); } catch (GameFrameworkException ex) when (ex.Message == \"Unload scene success callback is invalid.\") { Log.Error(ex, \"Missing success callback\"); }","preventionTips":["Never pass nullable delegates to callback bundle constructors","Assign handler methods before constructing the callbacks object","Prefer method groups over conditionally-initialized delegate fields"],"tags":["resource","callback","argument-validation"],"backgroundTag":"null-argument","analyzedSha":"d0c010b05167c58e92350449d04864a91ca13fd2","analyzedAt":"2026-09-15T13:37:15.352Z","contentChangedAt":"2026-09-15T13:37:15.352Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}