{"record":{"id":"594beb371365aaaa","repo":"EllanJiang/GameFramework","slug":"appenderrormessage","errorCode":null,"errorMessage":"appendErrorMessage","messagePattern":"appendErrorMessage","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"error","filePath":"GameFramework/Base/DataProvider/DataProvider.cs","lineNumber":447,"sourceCode":"            }\n            finally\n            {\n                m_DataProviderHelper.ReleaseDataAsset(m_Owner, dataAsset);\n            }\n        }\n\n        private void LoadAssetOrBinaryFailureCallback(string dataAssetName, LoadResourceStatus status, string errorMessage, object userData)\n        {\n            string appendErrorMessage = Utility.Text.Format(\"Load data failure, data asset name '{0}', status '{1}', error message '{2}'.\", dataAssetName, status, errorMessage);\n            if (m_ReadDataFailureEventHandler != null)\n            {\n                ReadDataFailureEventArgs loadDataFailureEventArgs = ReadDataFailureEventArgs.Create(dataAssetName, appendErrorMessage, userData);\n                m_ReadDataFailureEventHandler(this, loadDataFailureEventArgs);\n                ReferencePool.Release(loadDataFailureEventArgs);\n                return;\n            }\n\n            throw new GameFrameworkException(appendErrorMessage);\n        }\n\n        private void LoadAssetUpdateCallback(string dataAssetName, float progress, object userData)\n        {\n            if (m_ReadDataUpdateEventHandler != null)\n            {\n                ReadDataUpdateEventArgs loadDataUpdateEventArgs = ReadDataUpdateEventArgs.Create(dataAssetName, progress, userData);\n                m_ReadDataUpdateEventHandler(this, loadDataUpdateEventArgs);\n                ReferencePool.Release(loadDataUpdateEventArgs);\n            }\n        }\n\n        private void LoadAssetDependencyAssetCallback(string dataAssetName, string dependencyAssetName, int loadedCount, int totalCount, object userData)\n        {\n            if (m_ReadDataDependencyAssetEventHandler != null)\n            {\n                ReadDataDependencyAssetEventArgs loadDataDependencyAssetEventArgs = ReadDataDependencyAssetEventArgs.Create(dataAssetName, dependencyAssetName, loadedCount, totalCount, userData);\n                m_ReadDataDependencyAssetEventHandler(this, loadDataDependencyAssetEventArgs);","sourceCodeStart":429,"sourceCodeEnd":465,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/Base/DataProvider/DataProvider.cs#L429-L465","documentation":"In LoadAssetOrBinaryFailureCallback, when neither an asset nor binary load path succeeded, DataProvider throws GameFrameworkException with appendErrorMessage — the accumulated error message from the failed load attempt. The message text is not a fixed string; it carries the underlying load failure details.","triggerScenarios":"A data asset load fails (ResourceComponent reports load failure) and no ReadDataFailureEventHandler is subscribed, so the callback cannot deliver the failure via event args and instead throws with the accumulated error message.","commonSituations":"Data asset missing from resource packs/built AssetBundles; wrong asset name passed to ReadData; resource loading infrastructure misconfigured; running in editor without the asset present.","solutions":["Read appendErrorMessage to find the underlying load failure (missing asset, IO error, etc.).","Fix the asset name/path or rebuild resource packages so the data asset exists.","Ensure the resource system can locate the asset (check SearchPaths, AssetBundle manifests).","Subscribe ReadDataFailureEventHandler so load failures surface as events instead of exceptions."],"exampleFix":"// before\ndataTableComponent.ReadData(\"MissingTable\"); // throws on load failure\n// after\nm_DataTableComponent.ReadDataFailure += (sender, e) =>\n{\n    Log.Error(\"Data load failed: {0} - {1}\", e.DataAssetName, e.ErrorMessage);\n};\nm_DataTableComponent.ReadData(\"MyDataTable\");","handlingStrategy":"try-catch","validationCode":"// Pre-check asset presence before loading\nif (resourceComponent.HasAsset(dataAssetName))\n{\n    dataProvider.ReadData(dataAssetName);\n}\nelse\n{\n    Log.Error(\"Data asset '{0}' does not exist in resource packages\", dataAssetName);\n}","typeGuard":null,"tryCatchPattern":"try\n{\n    dataProvider.ReadData(dataAssetName);\n}\ncatch (GameFrameworkException ex)\n{\n    // ex.Message contains appendErrorMessage with the underlying load failure\n    Log.Error(\"Data load failed: {0}\", ex.Message);\n}","preventionTips":["Subscribe ReadDataFailureEventHandler so failures come as events, not exceptions.","Verify data asset names against the resource build manifest.","Rebuild resource packages after adding new data assets.","Check SearchPaths configuration when assets fail to resolve."],"tags":["gameframework","data-provider","asset-load-failure"],"backgroundTag":"resource-not-found","analyzedSha":"d0c010b05167c58e92350449d04864a91ca13fd2","analyzedAt":"2026-09-15T13:37:15.352Z","contentChangedAt":"2026-09-15T13:37:15.352Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}