0

短いsNumにはintnumの大きな範囲値が割り当てられ、変換が失敗するため、このコードは単に例外をスローします。ともかく。有効なshortの範囲が入力されるまでリクエストをループしたい。

    static void Main()
    {
        int num = 40000;
        short sNum = 0;
        try
        {
            sNum = Convert.ToInt16(num);

        }
        catch (OverflowException ex)
        {
            // Request for input until no exception thrown.
            Console.WriteLine(ex.Message);
            sNum = Convert.ToInt16(Console.ReadLine());
        }

        Console.WriteLine("output is {0}",sNum);
                        Console.ReadLine();
    }

ありがとうございました。

4

2 に答える 2

6

catchその理由は、ブロック内で変換が失敗したときに例外をスローしているためです。ブロックは技術的にはブロックのcatch外側にあるtryので、あなたが思っているようにブロックに引っかかることはありませんcatch。これは、実際にはループとして動作しているわけではありません。

例外は、通常、コード内の通常の(例外ではない)イベントに最適な方法とは見なされません。このTryParse場合、メソッドとループの方がはるかに優れています。

static void Main()
{
    string input = //get your user input;
    short sNum = 0;

    while(!short.TryParse(input,out sNum))
    {
        Console.WriteLine("Input invalid, please try again");
        input = //get your user input;
    }

    Console.WriteLine("output is {0}",sNum);
    Console.ReadLine();
}
于 2012-10-27T09:10:05.703 に答える
0
short sNum;
string input;

do
{
    input = Console.ReadLine();
} while (!Int16.TryParse(input, out sNum))

Console.WriteLine("output is {0}", sNum);
于 2012-10-27T09:12:26.920 に答える