
- •Структуры
- •Создание структуры
- •Пример создания и инициализации структуры:
- •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
- •Первая форма оператора игнорирует переполнение для указанного выражения, а вторая – для блока

catch (DivideByZeroException)
{
Console.WriteLine ("деление на ноль");
}
catch (IndexOutOfRangeException)
{
Console.WriteLine ("индекс за границами диапазона");
}
catch (NonIntResultException exc_obj)
{
Console.WriteLine (exc_obj+"\n");
}
}
}
}
41

Перехват исключений наследующего класса
Если в одной и той же программе необходимо перехватывать отдельно исключения для наследуемого и наследующего классов,
надо придерживаться определенного порядка в блоках catch.
А именно:
в последовательности блоков catch первым должен следовать блок с наследующим классом,
а уже потом с наследуемым.
Если придерживаться обратного порядка,
блок catch с наследуемым классом будет перехватывать исключения и во всех наследующих классах.
Более того, это приведет к появлению недостижимого кода – тех блоков catch, до которых никогда не дойдет выполнение.
В С# недостижимая конструкция catch ведет к появлению ошибки!
42

Пример 10. Создаются два класса исключений, затем в программе генерируются исключения обоих типов. Порядок следования блоков catch обеспечивает корректный перехват исключений.
using System;
class ExceptA: ApplicationException
{
public ExceptA () : base () {}
public ExceptA (string str) : base (str) {}
public override string ToString ()
{
return Message;
}
}
43

class ExceptB : ExceptA
{
public ExceptB () : base () {}
public ExceptB (string str) : base (str) {}
public override string ToString ()
{
return Message;
}
}
class Demo
{
public static void Main ()
{
for (int i=0;i<3;i++)
{
try
{
if(i==0) throw new ExceptA ("перехвачено исключение А");
else if (i==1)throw new ExceptB ("перехвачено исключение
B");
else throw new Exception ();
}
44

catch (ExceptB exc_obj)
{
Console.WriteLine (exc_obj);
}
catch (ExceptA exc_obj)
{
Console.WriteLine (exc_obj);
}
catch (Exception exc_obj)
{
Console.WriteLine (exc_obj);
}
}
}
}
45

Операторы checked, unchecked
В C# для случая переполнения при выполнении вычислений можно задать вызов исключений с помощью операторов
checked и unchecked.
Синтаксис оператора checked имеет вид:
checked (expr)
или
checked
{
//операторы
}
Если при вычислении выражения или выполнении операторов возникает переполнение,
то генерируется исключение OverflowException.
Синтаксис оператора unchecked имеет вид:
unchecked (expr)
или
unchecked
{
//операторы
}
46

Первая форма оператора игнорирует переполнение для указанного выражения, а вторая – для блока операторов.
При возникновении переполнения выполняется усечение результата.
Пример: как можно использовать данные операторы:
…
byte a = 127;
byte b = 127;
byte result;
try
{
result = unchecked ((byte) (a*b)); // будет усечение
Console.WriteLine("result="+result);
result = checked ((byte) (a*b)); // будет генерировано исключение
}
catch (OverflowException exc_obj)
{
Console.WriteLine (exc_obj);
}
…
47