2012-03-05 1 views
0

Я получаю сообщение «Ввести целое число», когда у меня есть оба номера учетной записи и сумма для ввода введена правильно.Неправильное исключение обрабатывается при вводе ввода в текстовые поля и нажатии кнопки

Скажем, я ввел «12» для номера счета и «50» (или «50.0») для суммы - я получаю сообщение «Ввести целое число».

Если я ничего не введу, я получу «Введите номер счета», который является корневым.

Если я ввожу только номер счета (не имеет значения, существует ли номер учетной записи или нет), но оставить количество пустым - я ничего не могу получить от нажатия кнопки снятия.

Если я ввожу номер и сумму счета (неправильно или правильно, не имеет значения), я получаю сообщение об ошибке «Ввод и целое число».

Где я ошибся?

private void btnWithdraw_Click(object sender, EventArgs e) 
     { 
      if (!txtSearch.Text.Equals("")) 
      { 
       if(!txtAmount.Text.Equals("")) 
       { 
        try 
        { 
         int aN = int.Parse(txtSearch.Text); 
         double am = double.Parse(txtAmount.Text); 
         client.Withdraw(aN, am); 
         MessageBox.Show(String.Format("Withdrawn {0} from {1}\nBalance now: {2}", am, aN)); 
         //if(client.Fi) 
         // MessageBox.Show(String.Format("Customer {0} couldn't be found", aN)); 
         //else 
         // MessageBox.Show(String.Format("Customer {0}\nBalance: {1}C", aN, client.CustomerBalance(aN).ToString())); 

        } 
        catch (FormatException) 
        { 
         MessageBox.Show("Enter an integer"); 
        } 
        catch (NullReferenceException) 
        { 
         MessageBox.Show("Customer cannot be found"); 
        } 
        catch (Exception ex) 
        { 
         MessageBox.Show(ex.Message); 
        } 
       } 
      } 
      else 
      { 
       MessageBox.Show("Enter account number"); 
      } 
     } 

ответ

1

Почему вы не можете просто сделать это следующим образом:

int aN; 
double am; 
if(int.TryParse(txtSearch.Text,out aN) && double.TryParse(txtAmount.Text,out am)) 
{ 
    client.Withdraw(aN, am); 
    MessageBox.Show(String.Format("Withdrawn {0} from {1}\nBalance now: {2}", am, aN)); 
} 
else 
{ 
    //Do something 
} 
+0

спасибо. Очень красивый синтаксис. – Bob

3

Строка формата определяет три аргумента, но предоставили только два:

String.Format("Withdrawn {0} from {1}\nBalance now: {2}", am, aN) 

Это бросает FormatException , но не тот, о котором вы думали, когда вы написали блок catch FormatException.

Поэтому, чтобы избежать этого исключения, вам нужен способ получить новый баланс в переменной, которую вы можете передать до String.Format. (Вы можете также сделать бы хорошо использовать дольше, более-описательные имена переменных, чем aN и am.)

Ближайшого ответ на ваш вопрос о обработке исключений будут использовать отдельные блоки TRY для отдельных действий, предпринятых по методе , а именно разбор двух разных строк, выполнение транзакции, форматирование сообщения пользователю и показ этого сообщения. Это позволило бы разделить обработку для FormatException, выброшенную int.Parse от обработки для FormatException, сброшенного на string.Format.

Однако, как предлагает Арион, для анализа пользовательского ввода обычно лучше использовать TryParse, а не улавливать исключения (ваша проблема с улавливанием FormatException является хорошим примером того, почему!). Это, конечно, предполагает, что вы используете версию фрейма, которая имеет методы TryParse; они были добавлены в версии 2.0.

+0

Спасибо. Задача решена. Я буду серьезно относиться к названию переменных в будущем. – Bob

Смежные вопросы