Получение неправильного исключения обрабатывается при вводе ввода в текстовые поля и нажатии кнопки - PullRequest
0 голосов
/ 05 марта 2012

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

Скажем, я ввел «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");
            }
        }

Ответы [ 2 ]

3 голосов
/ 05 марта 2012

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

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

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

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

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

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

1 голос
/ 05 марта 2012

Почему вы не можете просто сделать это так:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...