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

C#控制台计算器运算错误处理实现问题求助

C#控制台计算器错误处理修复方案

原有代码核心问题

  • 输入解析(数字转换、输入拆分后取值)的逻辑写在try块外部,输入非数字、格式不合法时异常无法被捕获,会直接导致程序崩溃
  • 缺失运算符校验逻辑:既没有实现「仅使用文件内包含的运算符」的限制,也没有对不合法运算符返回对应提示
  • 未处理输入格式边界问题:比如用户输入内容不足3段时,直接取下标会触发索引越界异常

修复后完整代码

Program.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

class Program
{
    static List<Expression> expressions = new List<Expression>();
    // 存储从文件中提取的合法运算符,自动去重
    static HashSet<string> ValidOperators = new HashSet<string>();

    static void Read()
    {
        string[] rows = File.ReadAllLines("expressions.txt");
        foreach (var item in rows)
        {
            var exp = new Expression(item);
            expressions.Add(exp);
            // 收集所有合法运算符
            ValidOperators.Add(exp.operation);
        }
    }

    static void Calculator()
    {
        string actionRequest = "";
        while (actionRequest != "stop")
        {
            Console.Write("\nI need an action:");
            actionRequest = Console.ReadLine()?.Trim() ?? "";
            if (actionRequest == "stop")
            {
                Console.Write("Exit ---> |press any key|");
                break;
            }

            try
            {
                string[] data = actionRequest.Split(' ', StringSplitOptions.RemoveEmptyEntries);
                // 校验输入格式是否符合 数字 运算符 数字 的三段结构
                if (data.Length != 3)
                {
                    Console.WriteLine("other error");
                    continue;
                }

                // 校验运算符是否为文件中存在的合法运算符
                string symbol = data[1];
                if (!ValidOperators.Contains(symbol))
                {
                    Console.WriteLine("wrong operator");
                    continue;
                }

                // 解析数字
                if (!int.TryParse(data[0], out int firstNumber) || !int.TryParse(data[2], out int secondNumber))
                {
                    Console.WriteLine("other error");
                    continue;
                }

                string counting = $"{firstNumber} {symbol} {secondNumber}";
                switch (symbol)
                {
                    case "mod":
                        Console.WriteLine($"{counting} = {firstNumber % secondNumber}");
                        break;
                    case "div":
                        Console.WriteLine($"{counting} = {firstNumber / secondNumber}");
                        break;
                    case "/":
                        Console.WriteLine($"{counting} = {(double)firstNumber / secondNumber}");
                        break;
                    case "*":
                        Console.WriteLine($"{counting} = {firstNumber * secondNumber}");
                        break;
                    case "+":
                        Console.WriteLine($"{counting} = {firstNumber + secondNumber}");
                        break;
                    case "-":
                        Console.WriteLine($"{counting} = {firstNumber - secondNumber}");
                        break;
                    default:
                        Console.WriteLine("wrong operator");
                        break;
                }
            }
            catch (DivideByZeroException)
            {
                Console.WriteLine("other error");
            }
            catch (Exception)
            {
                Console.WriteLine("other error");
            }
        }
    }

    static void Main(string[] args)
    {
        Read();
        Calculator();
        Console.ReadKey();
    }
}

Expression.cs

class Expression
{
    public int op1, op2;
    public string operation;

    public Expression(string row)
    {
        var parts = row.Split(' ', StringSplitOptions.RemoveEmptyEntries);
        op1 = Convert.ToInt32(parts[0]);
        operation = parts[1];
        op2 = Convert.ToInt32(parts[2]);
    }
}

修复说明

  • 新增合法运算符校验集合,从expressions.txt读取的运算数据中自动提取去重,严格实现「仅使用文件内包含的运算符」的需求
  • 所有输入解析、运算逻辑全部移入异常捕获范围,除零、非数字输入、格式错误等异常统一返回other error提示
  • 新增运算符前置校验,不在合法集合内的运算符直接返回wrong operator提示
  • 优化输入拆分逻辑,避免多余空格导致的格式识别错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:18:03