{"record":{"id":"eddc6ca6366cc0bf","repo":"babalae/better-genshin-impact","slug":"keys-eddc6c","errorCode":null,"errorMessage":"音符 {keys} 的时值缺少右方括号","messagePattern":"音符 (.+?) 的时值缺少右方括号","errorType":"exception","errorClass":"FormatException","httpStatus":null,"severity":"warning","filePath":"BetterGenshinImpact/GameTask/Music/Service/MusicScoreParser.cs","lineNumber":312,"sourceCode":"\n                keys = sheet[(index + 1)..end];\n                index = end + 1;\n            }\n            else\n            {\n                keys = sheet[index].ToString();\n                index++;\n            }\n\n            if (index >= sheet.Length || sheet[index] != '[')\n            {\n                throw new FormatException($\"音符 {keys} 缺少时值\");\n            }\n\n            var bracketEnd = sheet.IndexOf(']', index + 1);\n            if (bracketEnd < 0)\n            {\n                throw new FormatException($\"音符 {keys} 的时值缺少右方括号\");\n            }\n\n            var value = sheet[(index + 1)..bracketEnd];\n            index = bracketEnd + 1;\n            if (value is \"^\" or \"&\")\n            {\n                tokens.Add(new YuanQinToken(keys, 0, value));\n                continue;\n            }\n\n            var separator = value.IndexOf('-');\n            var denominatorText = separator >= 0 ? value[..separator] : value;\n            var special = separator >= 0 ? value[(separator + 1)..] : \"none\";\n            if (!double.TryParse(denominatorText, NumberStyles.Float, CultureInfo.InvariantCulture,\n                    out var denominator))\n            {\n                throw new FormatException($\"无法解析音符 {keys} 的时值：{value}\");\n            }","sourceCodeStart":294,"sourceCodeEnd":330,"githubUrl":"https://github.com/babalae/better-genshin-impact/blob/a7cb36712dcb409be610257d877fcea3597e9d6b/BetterGenshinImpact/GameTask/Music/Service/MusicScoreParser.cs#L294-L330","documentation":"Thrown by MusicScoreParser.ParseYuanQinTokens(string) when a duration bracket '[' is opened but no matching ']' is found. The method uses sheet.IndexOf(']', index + 1) and throws if the result is -1.","triggerScenarios":"A yuanqin sheet string where a '[' is not followed by ']'. For example, 'Q[1 W[2]' where the first bracket is never closed.","commonSituations":"Manual editing error; truncated sheet; copy-paste mistake that dropped the closing bracket.","solutions":["Find the unclosed '[' and add the matching ']' in the sheet string.","Run a bracket-balance validator on the sheet before parsing.","Check the PerformanceScore.Error property for context."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Check bracket balance\nint openSq = sheet.Count(c => c == '[');\nint closeSq = sheet.Count(c => c == ']');\nif (openSq != closeSq) { logger.LogError(\"方括号不匹配\"); }","typeGuard":null,"tryCatchPattern":"var score = await parser.ParseAsync(path, rootFolder, ct);\nif (!string.IsNullOrEmpty(score.Error)) { logger.LogWarning(score.Error); }","preventionTips":["Balance-check square brackets in the sheet.","Ensure every '[' has a matching ']'.","Validate sheet syntax before playback."],"tags":["music","yuanqin","format-exception","score-syntax","user-content"],"backgroundTag":null,"analyzedSha":"a7cb36712dcb409be610257d877fcea3597e9d6b","analyzedAt":"2026-08-13T16:44:57.548Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}