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
相关产品推荐
相关产品推荐

