Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Обработка исключений


Автор: PashaSem 2.2.2007, 12:52
Все Привет!
Есть ввод значения в    int  Unit_Number = Int32.Parse(Adr_drives.Text);
и  его обработка .
Код

 private void Appl_Adr_Click(object sender, EventArgs e)
        {
            try
            {
                
                    int  Unit_Number = Int32.Parse(Adr_drives.Text);
                    int step_number = Int32.Parse(Steps_Num.Text);
                
                if ((Unit_Number >= 1 && Unit_Number <= 16) && (step_number >= -400000 && step_number <= 400000))
                {
                    string Drive_Adress = "D330";
                    Conn_W_IntData(Drive_Adress, Unit_Number);
                    string szDeviceList1 = "D331";
                    Connection_W_Data(szDeviceList1, step_number);

                }
                else { MessageBox.Show(" Не правильные значения ввода "); }
            }
            catch (FormatException fEx)
            { MessageBox.Show(fEx.Message); }// = fEx.Message; }
        }

Все работает пока не вводим число 5000000000 в Steps_Num.Text);
Как избежать данной ситуации 
Спасибо!

Автор: Дрон 2.2.2007, 14:02
Цитата(PashaSem @  2.2.2007,  12:52 Найти цитируемый пост)
Все работает пока не вводим число 5000000000 в Steps_Num.Text

А что происходит? Программа говорит: "Всё! Больше работать не буду!"  smile 

Но я, наверно, сейчас угадаю... Возникает unhandled exception (необработанное исключение) и программа сваливается в отладчик?
Теперь... Если чуть-чуть, буквально самую малость, призадуматься и попытаться понять, что же стоит за словами необработанное исключение, то мы придём к выводу, что его на самом деле нужно обработать! Гениально, не правда ли?

Но ведь у нас же уже есть блок catch, возразит автор. Есть-то он есть, но только откуда бедному автору (ведь у него нет MSDN) знать, какие именно исключения могут произойти в методе Int32.Parse...
Подскажу. Там может возникнуть ещё и OverflowException, когда полученное число выходит за диапазон Int32... И ведь надо же такому случиться, что 5000000000 действительно вне этого диапазона.
Чёрт. Кто бы мог подумать. Особенно если учесть, что сам отладчик должен сказать, что произошло OverflowException. Мистика, не правда ли?

Автор: -Mikle- 2.2.2007, 14:07
Тип int может содержать значения от -2 147 483 647 до 2 147 483 648
Есть тип uint содержащий значения от 0 до 4 294 967 296
В твоем случае 5 миллиардов, что выходит за границы типа.
Используй тип long или ulong , чтобы сохранить такие цифры.
long от -9 223 372 036 854 775 807 до 9 223 372 036 854 775 808
ulong от 0 до 18 446 744 073 709 551 616
такого диапазона хватит тебе хватит точно!  smile 

Автор: PashaSem 2.2.2007, 15:57
Спасибо За Столь Поучительный Урок!
Я понял!  Вопрос Буду ставить более точно.
То что нет возможности преобразовать в Int32 это понятно по сообщению.
НО дальнейшая работа с полученной величиной должна проволиться именно с Int32. преобразование типов не гарантирует что пользователь не нажмет клавишу и не будет держать ее до упора!


Как вариант Возможно просто ограничить количество вводимых знаков ?

Спасибо!

Автор: ivashkanet 2.2.2007, 16:01
Цитата(PashaSem @  2.2.2007,  14:57 Найти цитируемый пост)
Как вариант Возможно просто ограничить количество вводимых знаков ?

Как вариант, обычно говорят пользователю, что он ввел слишком большое число и просят ввести еще раз  smile 

Автор: -Mikle- 2.2.2007, 16:48
мда... вот что значит не правильная постановка вопросов!!!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)