
- •Структуры
- •Создание структуры
- •Пример создания и инициализации структуры:
- •class Demo
- •Переопределение функций
- •Пример:
- •class MainClass
- •Упаковка и распаковка
- •Обратный процесс извлечения значения из объекта называется
- •Пример упаковки
- •Для чего можно явно применять механизм упаковки – распаковки?
- •Обработка исключений
- •Класс System.Exception и его потомки
- •Методы обработки исключений
- •Выполнение программы происходит по следующему алгоритму:
- •Пример 1. Обработка явно предусмотренного исключения IndexOutOfRangeException – выход индекса за границы.
- •Последовательность перехвата исключений в цепочке методов
- •если обработка этого исключения предусмотрена в Met1,
- •Пример 2. Иллюстрация алгоритма - исключение будет генерироваться одним методом, а обрабатываться –
- •class Demo
- •Обработка повторяющихся исключений
- •Использование нескольких блоков catch
- •Перехват всех возможных исключений
- •Алгоритм обработки исключений :
- •using System;
- •catch (DivideByZeroException)
- •Генерирование исключений
- •Оператор throw используется также для повторной генерации исключений – после того, как соответствующее
- •class Demo
- •Блок finally
- •catch (DivideByZeroException)
- •Класс Exception
- •Пример 8. Иллюстрация использования методов и свойств класса Exception.
- •catch (IndexOutOfRangeException exc_obj)
- •Наследование классов исключений
- •class ClassDemo
- •catch (DivideByZeroException)
- •Перехват исключений наследующего класса
- •Пример 10. Создаются два класса исключений, затем в программе генерируются исключения обоих типов.
- •class ExceptB : ExceptA
- •catch (ExceptB exc_obj)
- •Операторы checked, unchecked
- •Первая форма оператора игнорирует переполнение для указанного выражения, а вторая – для блока

Оператор throw используется также для повторной генерации исключений – после того, как соответствующее исключение уже было обработано.
Такой прием используют для того, чтобы одно и то же исключение обрабатывалось несколькими обработчиками.
Оператор в этом случае имеет вид:
throw;
Пример 6. Повторное генерирование исключения приведет к поэтапной обработке – в самом методе и в Main.
using System;
class Test_Exc
{
public static void GenExc ( )
{
int [ ] arr1 = {10,20,30,40,50,60,70,80};
int [ ] arr2 = {10,0,30,40,0,60};
for (int i = 0;i<arr1.Length; i++)
{
31

try
{
Console.WriteLine(arr1[i]+"/"+arr2[i]
+"="+arr1[i]/arr2[i]);
}
catch (DivideByZeroException)
{
// перехват исключения
Console.WriteLine ("деление на ноль");
}
catch (IndexOutOfRangeException)
{
// перехват исключения
Console.WriteLine ("индекс за границами диапазона");
throw; // повторное генерирование исключения
}
}
}
}
32

class Demo
{
public static void Main ( )
{
try
{
Test_Exc.GenExc ();
}
catch (IndexOutOfRangeException)
{
// повторный перехват исключения
Console.WriteLine ("выполнение программы прервано");
}
}
}
33

Блок finally
Блоки try-catch могут быть дополнены блоком finally,
вкотором помещают программный код, гарантированно выполняющийся – вне зависимости от того,
возникали ли исключительные ситуации,
была ли выполнена их обработка.
Синтаксис этого блока:
finally
{
// операторы
}
Пример 7. Способ применения блока finally.
using System;
class Demo
{
public static void Main ( )
{
int [ ] arr1 = {10,20,30,40,50,60,70,80};
int [ ] arr2 = {10,0,30,40,0,60};
for (int i = 0;i<arr1.Length; i++)
{
try
{
Console.WriteLine(arr1[i]+"/"+arr2[i]+"="+arr1[i]/arr2[i]);
}
34

catch (DivideByZeroException)
{
// перехват исключения
Console.WriteLine ("деление на ноль");
}
catch (IndexOutOfRangeException)
{
// перехват исключения
Console.WriteLine ("индекс за границами диапазона");
}
finally
{
// выполняется всегда
Console.WriteLine ("шаг цикла выполнен");
}
}
}
}
35

Класс Exception
Структура класса
Все классы исключений наследуют класс Exception.
Для работы с объектами этого класса имеется довольно много свойств.
Наиболее важные:
Message, StackTrace, TargetSite. Эти свойства – только для чтения.
Message – содержит строку, описывающую природу ошибки.
StackTrace – строка, включающая стек вызовов, предшествующих исключению.
TargetSite – возвращает объект, который указывает на метод, генерирующий исключение.
Из методов чаще всего используется ToString, возвращающий строку, описывающую исключение.
Этот метод вызывается автоматически, если исключение отображается с помощью метода WriteLine.
В данном классе определены 4 конструктора.
При создании пользовательских классов исключений требуется реализовать следующие два:
Exception ( )
Exception (string str)
36

Пример 8. Иллюстрация использования методов и свойств класса Exception.
using System;
class Test_Exc
{
public static void GenExc ()
{
int [] arr = new int [5];
// выход за границы массива
arr [10] = 123;
}
}
class ClassDemo
{
public static void Main( )
{
try
{
Test_Exc.GenExc ();
}
37

catch (IndexOutOfRangeException exc_obj)
{
// перехват исключения
Console.WriteLine ("стандартное сообщение из метода ToString:");
Console.WriteLine (exc_obj+"\n");
Console.WriteLine ("свойство StackTrace: "+exc_obj.StackTrace+"\n");
Console.WriteLine ("свойство Message: "+exc_obj.Message+"\n");
Console.WriteLine ("свойство TargetSite: "+exc_obj.TargetSite+"\n");
}
}
}
38

Наследование классов исключений
Можно построить свой класс исключений, используя в качестве наследуемого класс ApplicationException.
Пользовательские классы исключений автоматически получают доступные для них свойства и методы класса Exception.
При необходимости можно переопределять конкретные элементы класса.
Пример 9. Требуется создать класс NonIntResultException (не целый результат) со стандартной реализацией конструкторов и переопределенным методом ToString.
using System;
class NonIntResultException: ApplicationException
{
public NonIntResultException (): base () { }
public NonIntResultException (string str): base (str) { }
// переопределение метода ToString
public override string ToString ()
{
return Message;
}
}
39

class ClassDemo
{
public static void Main( )
{
int [ ] arr1 = {10, 20, 25, 40, 45, 50};
int [ ] arr2 = {2, 0, 4, 0, 2};
for (int i = 0; i<arr1.Length; i++)
{
try
{
if (arr1[i]%2 !=0)
throw new NonIntResultException (arr1[i] +"/"+arr2[i]+" - не целое");
Console.WriteLine
(arr1[i]+"/"+arr2[i]+"="+arr1[i]/arr2[i]);
}
40