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

如何使用Catch捕获十进制输入异常 为C#计算器添加错误提示

问题根因

  • 异常捕获位置错误:Convert.ToInt32() 方法在输入内容无法转为整数(比如带小数点的十进制数)时才会抛出 FormatException,你的现有代码把 try-catch 包裹在了整数运算逻辑上,int类型的四则运算本身不会触发格式异常,转换步骤在try块外,异常直接抛出不会被捕获。
  • 大部分运算分支的catch块为空,即使触发异常也没有任何提示输出。
  • 输入解析逻辑存在缺陷,负数处理、非法格式输入的场景没有做防护,容易触发索引越界崩溃。

修复后的代码

static void Main(string[] args)
{
    try
    {
        Console.Write("Enter an equation:");
        string input = Console.ReadLine().Trim();
        // 前置判断是否包含小数点,直接拦截十进制输入
        if (input.Contains('.'))
        {
            Console.WriteLine("Decimal value is invalid");
            Console.ReadLine();
            return;
        }

        string[] terms = input.Split(new Char[] { ' ', '+', '-', '*', '/' }, StringSplitOptions.RemoveEmptyEntries);
        if (terms.Length < 2)
        {
            Console.WriteLine("输入的算式格式不正确");
            Console.ReadLine();
            return;
        }

        int firstNumber = Convert.ToInt32(terms[0]);
        if (input[0] == '-')
        {
            firstNumber = -firstNumber;
            input = input.Remove(0, 1);
        }
        input = input.Remove(0, terms[0].Length).Trim();

        if (input.Length == 0)
        {
            Console.WriteLine("输入的算式格式不正确,缺少运算符");
            Console.ReadLine();
            return;
        }
        char op = input[0];
        input = input.Remove(0, 1).Trim();

        int secondNumber = Convert.ToInt32(terms[1]);
        if (input.Length > 0 && input[0] == '-')
            secondNumber = -secondNumber;

        int result = 0;
        switch (op)
        {
            case '+':
                result = firstNumber + secondNumber;
                break;
            case '-':
                result = firstNumber - secondNumber;
                break;
            case '*':
                result = firstNumber * secondNumber;
                break;
            case '/':
                if (secondNumber == 0)
                {
                    Console.WriteLine("除数不能为0");
                    Console.ReadLine();
                    return;
                }
                result = firstNumber / secondNumber;
                break;
            default:
                Console.WriteLine("不支持的运算符");
                Console.ReadLine();
                return;
        }
        Console.WriteLine(result);
    }
    catch (FormatException)
    {
        Console.WriteLine("Decimal value is invalid");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"输入错误:{ex.Message}");
    }
    Console.ReadLine();
}

核心调整点

  • 把所有输入解析、转换、运算逻辑都放在同一个try块内,Convert.ToInt32() 触发的格式异常可以被直接捕获。
  • 新增了输入是否包含小数点的前置判断,不需要等转换异常就可以直接拦截十进制输入,性能和可读性更好。
  • 补充了算式格式校验、除数为0校验、非法运算符校验等边界逻辑,避免程序崩溃。
  • 删掉了无意义的空catch块,所有异常分支都有对应提示。

内容的提问来源于stack exchange,提问作者Yazer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:45:02