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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:12:25