Пример разработки приложения вычисления выражения с перехватом возможных исключительных ситуаций
В данной теме продемонстрировано применение C++ — подсистемы обработки исключительных ситуаций, которые могут возникать при вычислении выражений. Приведен пример использования инструкций try … throw … catch в приложении.
Условие задачи
Разработать приложение на языке C++ по шаблону Windows Forms Application, которое решает задачу вычисления выражения.
При вычислении выражения нужно осуществить перехват критической (исключительной) ситуации с помощью блока try … catch. В приложении реализовать генерирование критической ситуации с помощью инструкции throw.
Составить приложение, которое при заданных значениях х и y находит значение выражения:
Выполнение
1. Создание проекта.
Загрузить MS Visual Studio. Создать проект по шаблону Windows Forms Application. Более детально создание нового проекта описывается здесь.
Создается приложение по шаблону Visual C++ — Windows Forms Application.
2. Размещение элементов управления (компонент) на форме.
Используя панель Toolbox разместить на форме следующие элементы управления:
- два элемента управления типа Label для вывода информационных сообщений «x = » и «y = » (рисунок 1). Автоматически создаются объекты (переменные) с именами label1 и label2;
- два элемента управления типа TextBox (рисунок 2). Создается два объекта (переменные) с именами textBox1, textBox2;
- один элемент управления типа Button (рисунок 3). Создается объект с именем button1;
- один элемент управления типа Label для вывода результата вычисления. Создается объект с именем label3 (рисунок 4).
Рисунок 1. Элемент управления Label
Рисунок 2. Размещение элементов управления TextBox
Рисунок 3. Размещение элемента управления типа Button
Рисунок 4. Форма программы после размещения элементов управления
3. Настройка свойств элементов управления
Пример настройки свойств элементов управления описывается здесь. Настройка свойств осуществляется в окне Properties (рисунок 5). В верхней части окна указывается объект, который есть активным (например label1). Для этого объекта можно осуществлять настройку свойств. Чтобы активировать объект есть два способа:
- выбрать объект из нисходящего списка в окне Properties;
- выделить объект на главной форме.
Рисунок 5. Окно Properties
В соответствии с условием задачи нужно настроить следующие свойства элементов управления:
- в элементе управления label1 свойство Text = «x = » (рисунок 6);
- в элементе управления label2 свойство Text = «y =«;
- в элементе управления button1 свойство Text = «Вычислить«;
- в элементе управления label3 свойство Text = «Результат = «;
- в элементе управления Form1 (главная форма) свойство Text = «Вычисление выражений«.
Рисунок 6. Задание значения свойства Text в элементе управления label1
После размещения и настройки, форма приложения будет иметь вид, как показано на рисунке 7.
Рисунок 7. Форма приложения после настройки
4. Программирование обработчика события клика на кнопке «Вычислить«
Последним шагом есть выполнение вычислений, которое осуществляется кликом на кнопке «Вычислить». В этом случае программируется событие Click элемента управления Button.
Более детально о программировании события клика на кнопке описывается здесь.
После программирования события будет получен метод – обработчик события button1_Click():
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
}
В этом обработчика между скобками { } нужно ввести собственный код расчета выражения (в соответствии с условием задачи).
После ввода кода вычисления выражения обработчик события button1_Click() будет иметь следующий вид:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { double x, y; double res; // в блок try помещается код, который нужно перехватить try { // проверка на пустой ввод // генерируется исключение с текстом типа char * if ((textBox1->Text == "")&&(textBox2->Text == "")) throw "не введены значения x и y"; if (textBox1->Text == "") throw "не введено значение x"; // тип char * if (textBox2->Text == "") throw "не введено значение y"; // получить значение с textBox1 и textBox2 x = System::Double::Parse(this->textBox1->Text); // первый способ y = y.Parse(this->textBox2->Text); // второй способ if ((x-y)<0) throw 1; // исключение №1 - корень из отрицательного числа if (y == 0) throw 2; // исключение №2 - деление на ноль res = (double)Math::Sqrt(x-y)/(double)y; // если нет исключений, то вывод результата label3->Text = "Результат: " + res.ToString(); } catch (int t) // обработчик исключения типа int { // перехват, если возникла исключительная ситуация if (t==1) label3->Text = "Ошибка! Корень из отрицательного числа."; if (t==2) label3->Text = "Ошибка! Деление на ноль"; } catch (char * s) // обработчик исключения типа char* { // конвертировать char* в String String ^ss = gcnew String(s); label3->Text = ss; } }
Объясним некоторые фрагменты кода.
В блок try помещается программный код, который нужно проконтролировать. В нашем случае это:
- ввод пустых значений в элементах управления textBox1 и textBox2;
- выражение под квадратным корнем, которое может принять отрицательное значение. Поскольку корень квадратный из отрицательного значения не существует, то может возникнуть исключительная ситуация;
- знаменатель, который может принять нулевое значение. Как известно, деление на ноль вызовет переполнение или исключительную ситуацию.
Инструкция throw генерирует исключение, которое перехватывается catch-инструкцией.
Инструкция throw содержит информацию об исключительной ситуации. Эта информация может быть разных типов и обрабатываться в блоках catch, которые идут после блока try.
В демонстрационных целях, в приложении генерируются четыре исключения с помощью инструкции throw:
- два исключения типа char* в виде сообщения об ошибке;
- два исключения типа int в виде целочисленного кода.
Использование системы обработки исключений try … catch дает программисту удобный инструмент для обработки исключительных ситуаций.
5. Запуск программы на выполнение.
После этого можно запускать программу на выполнение и тестировать ее работу.