2015-04-17 2 views
0

Я пишу программу, где мне нужно написать уловить нулевые или общие исключения ввода с помощью try ... catch блоков и убедиться, что вход находится между двумя номерами с if заявление.Исключение, проигнорированное (приложение формы C#)

Моя проблема заключается в том, что исключение игнорируется, когда я помещаю нуль, строку или другой символ, он просто переходит к выражению if. Если я прокомментирую инструкцию if, исключение все равно не поймается.

const char DELIM = ','; 
int input; 
const int MIN = 1; 
const int MAX = 10; 
//convert the input to an integer 
int.TryParse(tbInput.Text, out input); 
//check if the user has selected enter yet 
if (e.KeyCode == Keys.Enter) 
{ 
    try 
    {          
     //if the number entered is out of ranger, show error 
     if (input < MIN || input > MAX) 
     { 
      MessageBox.Show("Please enter an integer between 1 and 10"); 
     } 
     else 
     { 
      //if the number is in range, write to file 
      StreamWriter writer = new StreamWriter(file); 
      writer.WriteLine(input.ToString() + DELIM + " "); 
      writer.Flush(); 
      //flush the information to the file each time 
     } 
    } 
    // any exceptions that occur will be caught here 
    catch (IOException) 
    { 
     MessageBox.Show("Error with input"); 
    } 
    finally 
    { 
     //clear the taxtbox for the next entry 
     tbInput.Clear();      
    } 
} 

Вот мой код. Если кто-то может указать, где я что-то упускаю, или что я должен изменить, я бы очень признателен. Приветствия!

+0

В какой строке вы ожидаете выбросить ошибку? –

ответ

3

int.TryParse возвращает логическое значение при проверке данного аргумента. При попытке конверсии input будет присвоено значение по умолчанию (0). Измените свой код, чтобы проверить результат int.TryParse.

if (int.TryParse(tbInput.Text, out input)) 
{ 
    // ok 
} 
else 
{ 
    // not ok 
} 
+0

Работает отлично! Спасибо! –

1

Моя проблема заключается в том, что исключение игнорируется, когда я помещаю нуль, строку или другой символ, он просто переходит к утверждению if. Если я прокомментирую инструкцию if, исключение все равно не поймается.

Вы пытаетесь проанализировать ввод с помощью Integer.TryParse. Этот метод возвращает логическое значение для указания успеха (или его отсутствия). Как я и ожидал, вы не контролируете поток с помощью метода.

Попробуйте

if (int.TryParse(tbInput.Text, out input)) 
0

Ваш вопрос в том, что вы используете TryParse вместо Parse. TryParse возвращает false, но не генерирует исключение, если синтаксический анализ не выполняется.

Попробуйте использовать:

input = int.Parse(tbInput.Text); 
+0

* и * им нужно поместить это в 'try catch'. Я тоже не думаю, что они это понимают. –

+0

Да, хорошая точка. –

1

int.TryParse никогда не провалится. Он вернет false, если это не удастся. Вы можете сделать следующее:

int input; 
if (e.KeyCode == Keys.Enter) 
{ 
    if (int.TryParse(tbInput.Text, out input) && input >= MIN && input <= MAX) 
    { 
     ... 
    } 
    else 
    { 
     MessageBox.Show("Please enter an integer between 1 and 10"); 
    } 
} 

Или, вы можете просто положить int.Parse в вашей попытке поймать и поймать FormatException и OverflowException (потому что он может не). Я буду использовать Convert.ToInt32, так как он почти идентичен int.Parse, но возвращает 0, если аргумент null вместо того, чтобы метать ArgumentNullException.

if (e.KeyCode == Keys.Enter) 
{ 
    try 
    { 
     int input = Convert.ToInt32(tbInput.Text); 
     ... 
    } 
    catch (FormatException) 
    { 
     MessageBox.Show("Input was in an invalid format."); 
    } 
    catch (OverflowException) 
    { 
     MessageBox.Show("The input was outside the valid range for integers."); 
    } 
    catch (IOException) 
    { 
     MessageBox.Show("Error with input"); 
    } 
} 
Смежные вопросы