C#控制台程序捕获自定义异常后无法重试输入的问题咨询
问题根因
当前代码的输入校验逻辑仅单次执行:catch块打印完异常信息后,会直接退出当前try-catch结构,继续执行后续代码,没有任何逻辑将执行流程拉回输入步骤,自然无法触发重试。如果移除try-catch,未捕获的异常会直接导致进程终止,是C#控制台应用的默认行为。
调整方案
给每个输入环节套一层无限循环,只有输入完全合法、未触发任何异常时,才通过break关键字跳出循环,进入下一个流程节点。
修正后的可运行代码如下:
// 提前初始化用户对象,根据你自己的类定义调整即可 var user = new User(); // 用户名输入+校验+重试逻辑 while (true) { Console.WriteLine("请输入用户名:"); try { // 自动去除输入首尾的空格,兼容用户误输空格的场景 user.userName = Console.ReadLine()?.Trim(); if (string.IsNullOrEmpty(user.userName)) { throw new ArgumentException("用户名不能为空"); } if (user.userName != "Papa") { throw new ArgumentException("用户名不存在"); } // 执行到此处说明所有校验通过,跳出循环进入下一个输入环节 break; } catch (Exception e) { Console.WriteLine($"输入错误:{e.Message},请重新输入。"); } } // PIN码输入+校验+重试逻辑 while (true) { Console.WriteLine("请输入PIN码:"); try { string pinInput = Console.ReadLine()?.Trim(); user.userPin = Convert.ToInt32(pinInput); // 可按需扩展PIN码的业务规则,比如要求是4位数字 if (user.userPin is < 1000 or > 9999) { throw new ArgumentException("PIN码必须为4位数字"); } // 校验通过,跳出循环 break; } catch (Exception e) { Console.WriteLine($"输入错误:{e.Message},请重新输入。"); } } // 校验全部通过后才会执行的后续业务逻辑 Console.WriteLine("身份验证通过!");
补充说明
- 用
while(true)实现输入重试是控制台应用的常规写法,只要确保所有合法分支都会触发break,就不会出现死循环问题 - 读取输入时加
Trim()是为了过滤用户不小心输入的首尾空格、制表符,减少无意义的校验失败 - 如果需要更精细的异常处理,可以分开捕获格式转换异常(比如PIN输入非数字时抛出的
FormatException)和自定义业务异常,分别给用户更明确的错误提示
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

