C# 切换、案例、尝试并抓住C问题

C# 切换、案例、尝试并抓住C问题,c#,switch-statement,try-catch,C#,Switch Statement,Try Catch,我对C编程非常陌生。我想捕捉错误,例如无效输入,而不是1-6之间的数字,然后打印一条说明错误的消息。这是我的密码 private static bool ManageStudents() { Console.Clear(); Console.WriteLine("========================"); Console.WriteLine(" Choose an option:"); Console.Write

我对C编程非常陌生。我想捕捉错误,例如无效输入,而不是1-6之间的数字,然后打印一条说明错误的消息。这是我的密码

private static bool ManageStudents()
    {
        Console.Clear();
        Console.WriteLine("========================");
        Console.WriteLine(" Choose an option:");
        Console.WriteLine("  1. Add a new student");
        Console.WriteLine("  2. View all students");
        Console.WriteLine("  3. Search students");
        Console.WriteLine("  4. Delete students");
        Console.WriteLine("  5. Update students");
        Console.WriteLine("  6. Back to main menu");
        Console.WriteLine("========================");
        Console.Write("\r\nPlease choose: ");

        try
        {
            switch (Console.ReadLine())
            {
                case "1":
                    AddStudents();
                    return true;
                case "2":
                    ViewStudents();
                    return true;
                case "3":
                    SearchStudents();
                    return true;
                case "4":
                    DeleteStudents();
                    return true;
                case "5":
                    UpdateStudents();
                    return true;
                case "6":
                    return false;
                default:
                    return true;
            }
        }

        catch (Exception e)
        {
            Console.WriteLine("error message");
            Console.ReadLine();
            return true;
        }

    }
当我运行程序时,输入无效字符后,错误消息没有出现。

Replace

 default:
       return true;

在switch语句中使用的默认值就是这样——如果找不到匹配项,则默认为这种情况。如果希望try块失败,则需要在默认值内引发异常

您告诉它返回true而不出错。你应该把它改成

  default:
        throw new Exception("Invalid Selection")

您需要理解调用缺省值和调用catch之间的区别。如果此处的数字不在1-6的范围内,则当所有情况均为真时,将调用默认值。当开关中的一个函数抛出异常时调用catch,异常可能是AddStudents或SearchStudents,等等

然后,您可以通过添加一个接收消息作为参数的函数来更一般地处理错误。那么你应该有这样的东西:

private static bool HandleError(string message) { // More generic handling
   Console.WriteLine(message);
   Console.ReadLine();
   return true;
}

private static bool ManageStudents()
{
        Console.Clear();
        Console.WriteLine("========================");
        Console.WriteLine(" Choose an option:");
        Console.WriteLine("  1. Add a new student");
        Console.WriteLine("  2. View all students");
        Console.WriteLine("  3. Search students");
        Console.WriteLine("  4. Delete students");
        Console.WriteLine("  5. Update students");
        Console.WriteLine("  6. Back to main menu");
        Console.WriteLine("========================");
        Console.Write("\r\nPlease choose: ");

        try
        {
            switch (Console.ReadLine())
            {
                case "1":
                    AddStudents();
                    return true;
                case "2":
                    ViewStudents();
                    return true;
                case "3":
                    SearchStudents();
                    return true;
                case "4":
                    DeleteStudents();
                    return true;
                case "5":
                    UpdateStudents();
                    return true;
                case "6":
                    return false;
                default:
                    return HandleError("Out of range"); // Not in range 1-6
            }
        }

        catch (Exception e) // This catch exception happening in the all switch
        {
            return HandleError("Execution problem");
        }

    }

您的逻辑非常清楚:如果给定的数字不在有效数字列表中,请打印错误消息

所以,不要使用异常作为逻辑的一部分,异常是针对异常的,针对非预期的情况。此外,抛出异常将比使用switch case处理异常稍微贵一些


现在,您可以删除所有文件并重试。。挡块

您认为代码的哪一部分会触发catch块中的代码运行?尝试进一步阅读如何工作。如果Try块抛出异常,则输入catch块。若你们想处理开关箱以外的东西,你们应该把它放在默认的箱子上。在这种情况下不要使用try-catch。使用其他语句检查输入是否符合默认值。您正在从此方法返回布尔值。。真的意味着一切顺利吗?此外,即使您在默认情况下将语句更改为抛出异常,最终还是会从catch块返回true。您可能希望从catch块返回false。谢谢,我将对它们进行更多的阅读!我几天前才开始使用C,我只是在玩它。这些都是非常有用的评论,我很感激!您的答案可能解决了一个问题,但在这个社区中它被标记为低质量,因为您的答案只包含代码而不包含解释。请编辑详细信息虽然此代码可能提供问题的解决方案,但最好添加有关其工作原因/方式的上下文。这可以帮助未来的用户学习,并将这些知识应用到他们自己的代码中。在解释代码时,用户可能会以投票的形式向您提供正面反馈。很抱歉,回复太晚!非常感谢你,这很有效!这也行谢谢你的帮助!
  default:
        throw new Exception("Invalid Selection")
private static bool HandleError(string message) { // More generic handling
   Console.WriteLine(message);
   Console.ReadLine();
   return true;
}

private static bool ManageStudents()
{
        Console.Clear();
        Console.WriteLine("========================");
        Console.WriteLine(" Choose an option:");
        Console.WriteLine("  1. Add a new student");
        Console.WriteLine("  2. View all students");
        Console.WriteLine("  3. Search students");
        Console.WriteLine("  4. Delete students");
        Console.WriteLine("  5. Update students");
        Console.WriteLine("  6. Back to main menu");
        Console.WriteLine("========================");
        Console.Write("\r\nPlease choose: ");

        try
        {
            switch (Console.ReadLine())
            {
                case "1":
                    AddStudents();
                    return true;
                case "2":
                    ViewStudents();
                    return true;
                case "3":
                    SearchStudents();
                    return true;
                case "4":
                    DeleteStudents();
                    return true;
                case "5":
                    UpdateStudents();
                    return true;
                case "6":
                    return false;
                default:
                    return HandleError("Out of range"); // Not in range 1-6
            }
        }

        catch (Exception e) // This catch exception happening in the all switch
        {
            return HandleError("Execution problem");
        }

    }
private static bool ManageStudents()
{
    switch (Console.ReadLine())
    {
        case "1":
            AddStudents();
            return true;
        case "2":
            ViewStudents();
            return true;
        case "3":
            SearchStudents();
            return true;
        case "4":
            DeleteStudents();
            return true;
        case "5":
            UpdateStudents();
            return true;
        case "6":
            return false;
        default:
            Console.WriteLine("Invalid selection");
            return true;
    }
}