Стандартные исключения в C#
Пример
Чтобы исключить исключения, используйте оператор throw, передающий ему новый экземпляр класса исключения, который вы хотите выбросить. Часто код выглядит примерно так:
throw new FormatException("Cost must be a monetary amount.")
Замените FormatException классом исключения, который вы хотите выбросить. Конструкторы, предоставляемые разными классами исключений, принимают разные параметры. Большинство из них позволяют передать сообщение, которое включено в объект исключения, и что программа может показать пользователю. Вы должны сделать это сообщение максимально конкретным, чтобы у пользователя появилась возможность исправить проблему. Например, скажем, «Стоимость должна быть денежной суммой», а не «Ошибка формата».
Некоторые классы исключений могут передавать другие значения в их конструкторы, такие как имя параметра, вызывающего проблему, и значение параметра.
В этом примере, когда вы вводите процент затрат и процентов и нажмите «Рассчитать», выполняется следующий код.
// Рассчитаем подсказку. private void btnCalculate_Click(object sender, EventArgs e) { try { PerformCalculation(); } catch (Exception ex) { txtTipAmount.Clear(); MessageBox.Show(ex.Message); } } private void PerformCalculation() { // Анализ стоимости. decimal cost; if (!decimal.TryParse(txtCost.Text, NumberStyles.Currency, null, out cost)) throw new FormatException("Cost must be a monetary amount."); // Проверка стоимости. if ((cost < 0.01m) || (cost > 500m)) throw new ArgumentOutOfRangeException( "Cost must be between $0.01 and $500.00."); // Разбираем процент опроса. string percent_string = txtPercentTip.Text; if (percent_string.StartsWith("%")) percent_string = percent_string.Substring(1); else if (percent_string.EndsWith("%")) percent_string = percent_string.Substring( 0, percent_string.Length - 1); decimal tip_percent; if (!decimal.TryParse(percent_string, out tip_percent)) throw new FormatException("% Tip must be a numeric value."); // Если исходное значение содержит символ%, разделите его на 100. if (txtPercentTip.Text.Contains("%")) tip_percent /= 100m; // Проверяем процент. if ((tip_percent < 0) || (tip_percent > 100)) throw new ArgumentOutOfRangeException( "% Tip must be between 0% and 100%."); // Все действует. Выполните расчет. decimal tip_amount = cost * tip_percent; txtTipAmount.Text = tip_amount.ToString("C"); }
Обработчик события Click кнопки использует блок try catch, чтобы защитить себя, когда он вызывает метод PerformCalculation, который выполняет всю интересную работу.
Метод PerformCalculation пытается проанализировать введенное значение стоимости и, если оно терпит неудачу, выдает FormatException, чтобы сообщить вам, что стоимость недействительна. Если затраты анализируются, тогда код проверяет его значение и выдает ArgumentOutOfRangeException, если значение слишком велико или слишком мало.
Затем код выполняет аналогичные проверки для значения процента наконечника.
Всякий раз, когда код сталкивается с проблемой, которую он не может исправить, он выдает исключение, чтобы сообщить вызывающему коду, что произошло. В этом простом примере вы можете поместить код в метод PerformCalculation для отображения сообщений об ошибках, хотя это сделает код более сложным и немного беспорядочным. Этот метод гораздо важнее, когда код вызывается чьим-то кодом. В этом случае вы можете не знать, какое действие должен выполнять вызывающий код в ответ на различные ошибки, поэтому классы исключений сообщают вызывающему коду, что пошло не так.