ProjException程序异常捕获失效及非数值输入返回等级问题求助
兄弟,你的try语句没捕获到错误、输入任意字符都返回等级,核心原因是你没把「输入转换+范围验证」这些最容易出问题的环节放进try块,或者没主动抛出非法输入的异常,导致错误直接绕过了异常处理,程序还是执行到了等级判定的逻辑。下面是具体的遗漏点和修复方案:
1. 没捕获输入转数字的格式异常
如果你的代码是先读取输入,直接转成数字再进try块,那当用户输入非数字字符时,double.Parse()(或类似转换方法)抛出的FormatException根本没被try块覆盖;要是你用了TryParse()但没判断返回值,直接默认给了一个分数值,程序就会继续走正常流程,自然会返回等级。
修复方式:把「输入拆分+转换」的操作全部放进try块里,让格式异常能被捕获:
namespace ProjException { class ScoreCalculator { static void Main(string[] args) { while (true) // 支持多组输入循环 { Console.WriteLine("请输入一组分数(空格分隔,输入'q'退出):"); string input = Console.ReadLine().Trim(); // 退出逻辑 if (input.Equals("q", StringComparison.OrdinalIgnoreCase)) break; try { // 拆分输入并转换为分数 string[] scoreInputs = input.Split(' ', StringSplitOptions.RemoveEmptyEntries); double total = 0; foreach (string scoreStr in scoreInputs) { // 这里转换失败会抛出FormatException,被try块捕获 double score = double.Parse(scoreStr); // 验证分数范围,不合法则主动抛出异常 if (score < 0 || score > 100) throw new ArgumentOutOfRangeException(nameof(score), "分数必须在0-100之间"); total += score; } // 处理空输入(没有有效分数) if (scoreInputs.Length == 0) throw new InvalidOperationException("请至少输入一个有效分数"); // 计算平均分并判定等级 double average = total / scoreInputs.Length; char grade = GetLetterGrade(average); Console.WriteLine($"平均分:{average:F2},等级:{grade}"); } catch (FormatException) { Console.WriteLine("❌ 错误:请输入有效的数字!"); } catch (ArgumentOutOfRangeException ex) { Console.WriteLine($"❌ 错误:{ex.Message}"); } catch (InvalidOperationException ex) { Console.WriteLine($"❌ 错误:{ex.Message}"); } } } // 等级判定方法 static char GetLetterGrade(double average) { return average switch { >= 90 => 'A', >= 80 => 'B', >= 70 => 'C', >= 60 => 'D', _ => 'F' }; } } }
2. 没主动抛出分数范围异常
你可能只是做了范围检查,但没抛出异常,而是直接跳过错误继续计算——比如输入150分,你判断了但没拦截,还是把它加到总分里算平均分,自然会返回对应的等级。
修复方式:当分数不在0-100区间时,主动抛出ArgumentOutOfRangeException,让try块捕获并提示用户,而不是继续执行后续逻辑。
3. try块的覆盖范围太窄
如果你的try块只包住了「计算平均分」的代码,没包含「输入转换+范围验证」,那这些环节的异常根本不会被捕获,程序会直接跳过错误处理,执行到等级判定的步骤。
修复方式:把所有可能抛出异常的操作(输入转换、范围检查、空输入判断)都放进try块,确保任何错误都能被拦截。
4. 没处理空输入/无有效分数的情况
如果用户输入全是空格或者直接回车,拆分后得到空数组,计算平均分的时候会触发DivideByZeroException——你可以提前判断数组长度,主动抛出InvalidOperationException,或者直接捕获DivideByZeroException来处理。
内容的提问来源于stack exchange,提问作者Ray Walker

