You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:54:08