如何使用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
相关产品推荐
相关产品推荐

