Обработка исключительных ситуаций.

Обработка исключительных ситуаций

Современные приложения должны быть безопасными. В понятие безопасности включается, прежде всего, обработка программистом исключений. В C# предусмотрена обработка ошибочных (исключительных) ситуаций, связанных, как правило, с выполнением таких системных действий, как файловый ввод, вывод, деление на нуль и т. д.

В библиотеке System имеется класс исключений Exception, который перехватывает вообще все исключения.

Для обработки исключений в методах класса, или в функции Main(), программист должен разработать два программных блока:

// Первый блок:

Try

{

// Операторы. Здесь может произойти ошибка.

}

// Второй_блок:

catch (класс_Exception параметр)

{

// Операторы. Здесь происходит перехват ошибки.

}

Задание: В классе Natur_Chisla изменить метод Ostatok(…) и обработать исключение «Деление на нуль».

//В классе Natur_Chisla найдём нужный метод и изменим его:

public uint Ostatok(uint a, uint b)

{

//if (b==0)

//{

// Console.WriteLine("Деление на 0!");

// return a;

//} //это мы комментируем!

// Обработка исключения:

try

{

float d = 0;

if (b == 0)

d = a / b;

}

catch (Exception Ob)

{

Console.WriteLine("Деление на 0!");

Console.WriteLine(Ob.Message);

Console.WriteLine(Ob.TargetSite);

return a;

}

if (a < b)

return a;

while (a >= b)

a -= b;

return a;

}

//В Main():

Разкомментируем строки:

Natur_Chisla Ob1 = new Natur_Chisla();

Ob1.Show();

Natur_Chisla Ob2 = new Natur_Chisla(37, 18);

Ob2.Show();

Console.WriteLine("Остаток от деления =" + Ob2.Ostatok(54,0));

//Выполнить!

При возникновении ошибки внутри блока try в блоке catch проверяется, какой тип ошибки произошел. Если тип ошибки не соответствует типу возникшей ошибки, то программа завершается аварийно. Для одного блока try можно разработать несколько различных блоков catch, перехватывающих разные типы ошибок.

Перегрузка методов и конструкторов как механизм реализации полиморфизма. Виды конструкторов.

Перегрузка методов

В С# методы внутри одного класса могут иметь одинаковые имена, но при условии, что их параметры будут различными. Например, в классе Natur_Chisla это были методы: Ostatok(),Ostatok(uint a, uint b); в классе Num_Array это были методы: Sozd_rnd(int max), Sozd_rnd(int min, int max). Такую ситуацию называют перегрузкой методов, а методы – перегруженными.

Перегрузка методов – один из способов реализации полиморфизма в С# (“один интерфейс, множество методов”). Все перегруженные методы должны иметь списки параметров, которые отличаются по типу и/или количеству. При вызове перегруженного метода выполняется та его версия, параметры которой совпадают (по типу и количеству) с заданными аргументами. Перегрузка методов нужна тогда, когда нужно реализовать похожий по смыслу алгоритм для различных типов данных, чтобы не плодить имена. Перегрузка упрощает процесс программирования.

Следует отметить, что params-параметр не является определяющим фактором отличия одного перегруженного метода от другого (ведь через params можно передать и ноль аргументов). Спецификаторы параметров методов ref и out также не различают одноименные методы. Например, методы Swap1(…), Swap2(…) не должны быть перегруженными. Методам для перегрузки недостаточно отличаться лишь типами возвращаемых значений (может произойти автоматическое преобразование типов).

Итак, тип возвращаемого значения, спецификаторы параметров методов ref , out и params – это не факторы перегруженного метода.

Перегрузка конструкторов

Подобно другим методам, конструкторы также можно перегружать. Это позволяет создавать объекты различными способами. Чаще всего в классах разрабатывают конструкторы без параметров и конструкторы с параметрами. Конструктор без параметров нужен для создания массива объектов. Конструктор с параметрами нужен для создания единичного объекта.

Например, для решения задач планиметрии нужно создать массив объектов-точек. Здесь нужен конструктор без параметров. Если же нужно создать единичную точку с конкретными координатами, то необходимо использовать конструктор с параметрами.

Задание: В классе Point разработать метод Input_Point(), который вводит координаты точки с экрана. Создать масив точек.

//В классе Point:

public void Input_Point()

{

Console.WriteLine("Введите координаты точки!");

x = Double.Parse(Console.ReadLine());

y = Double.Parse(Console.ReadLine());

}

//В Main():

Point T1 = new Point(); //Раскомментируем строку

T1.Input_Point();

T1.Show();

//Выполнить!

Создание массива точек:

//В Main():

sbyte n;

Console.WriteLine("Введите количество точек!");

n = SByte.Parse(Console.ReadLine());

// Определение массива точек:

Point [ ] mas = new Point [n];

// Заполнение массива точек:

int i = 0;

for (i = 0; i < n; i++)

{

mas [i] = new Point();

mas [i].Input_Point();

}

Console.WriteLine("Содержимое массива точек:");

for (i = 0; i < n; i++)

mas[i].Show();

//Выполнить!

Перегружая конструктор класса, программист предоставляет пользователю этого класса определенную гибкость в выборе способа создания объекта. Одна из самых распространенных причин перегрузки конструктора – возможность инициализации одного объекта с помощью другого.Конструктор, которыйреализует такую возможность, называется конструктором копирования или конструктором-копировщиком.

Наши рекомендации