如何使用数组为IndexOutOfRangeException设置try catch异常?

时间:2013-11-28 00:54:53

标签: c# arrays exception exception-handling

我有一个方法需要用户输入与数组相关的char。我需要使用try catch异常语句来触发某种形式的异常,最好是IndexOutOfRangeException。如果用户没有输入正确的字符,则需要提示他们再次输入字符。

private static double dataEntry(string location, int num, int month, Mural[] murals)
{
    string entryString;
    bool isValid;
    int x;
    char code;
    double tot = 0;
    Console.WriteLine("\n\nEntering {0} jobs:", location);
    x = 0;
    while (x < num)
    {
        tot += murals[x].Price;
        Console.Write("Enter customer name >> ");
        murals[x].Name = Console.ReadLine();
        Console.WriteLine("Mural options are:");
        for (int y = 0; y < Mural.muralCodes.Length; ++y)
            Console.WriteLine("  {0}   {1}", Mural.muralCodes[y], Mural.muralTypes[y]);
        Console.Write("       Enter mural style code >> ");
        entryString = Console.ReadLine();
        isValid = false;
        while (!isValid)
        {
            try
            {
                code = char.Parse(entryString);
            }
            catch (FormatException)
            {
                Console.WriteLine("Wrong format");
                Console.Write("       Enter mural style code >> ");
                entryString = Console.ReadLine();
            }
            catch (IndexOutOfRangeException)
            {
                Console.WriteLine("Wrong format");
                Console.Write("       Enter mural style code >> ");
                entryString = Console.ReadLine();
            }
            finally
            {
                if (!char.TryParse(entryString, out code))
                {
                    Console.WriteLine("Wrong format");
                    Console.Write("       Enter mural style code >> ");
                    entryString = Console.ReadLine();
                }
                else
                {
                    murals[x].Code = code;
                    isValid = true;
                }
            }
        }
        ++x;
    }
    return tot;
}

4 个答案:

答案 0 :(得分:1)

您应该使用此功能Char.TryParse

char output;

if (char.TryParse(whatUserEntered, output))
{
  // Char is in output.
}
else
{
    //Bad entry by user.
}

答案 1 :(得分:1)

如果我正确理解您的问题,您希望有条件地触发异常。使用此代码:

if(/* not valid or out of bounds */) {
    throw new IndexOutOfRangeException();
}

答案 2 :(得分:0)

请参阅下面的msdn参考,重写您的代码并回发更多问题。

http://msdn.microsoft.com/en-us/library/ms173165(v=vs.110).aspx

答案 3 :(得分:0)

如果您真的必需使用try / catch,并且您想要重新启动用户,请尝试此操作。我将解释这一切,以便你了解发生了什么......因为它是家庭作业和所有。

你正在捕捉多个例外,但没有必要,因为你在每个例子中做同样的事情。抓住......什么也不做。在catch语句中实际上没有,但至少你的程序没有终止。在现实世界中,您将通知用户,或记录错误或其他内容。

char.Parse失败并抛出异常时,您的逻辑将永远不会到达接下来的两行(murals[x]...isValid = true),并且您的循环将重复,直到用户输入有效字符。此时,isValid为true并退出while循环。

bool isValid = false;

while (!isValid)
{
    Console.WriteLine("Wrong format");
    Console.Write("       Enter mural style code >> ");
    entryString = Console.ReadLine();

    try
    {
        code = char.Parse(entryString);

        murals[x].Code = code;
        isValid = true;
    }
    catch
    {
        // Just ignore the error
        // Bad practice, which is why others are suggesting Char.TryParse
    }
}