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

class Demo
{
public static void Main ( )
{
try
{
// вызов метода
Test_Exc.GenExc ();
}
catch (IndexOutOfRangeException)
{
// перехват исключения
Console.WriteLine (“индекс за границами диапазона”);
}
Console.WriteLine (“вышли из блока catch”);
}
}
Результат работы программы аналогичен предыдущему варианту:
индекс за границами диапазона
вышли из блока catch
21

Обработка повторяющихся исключений
Пример 3. Иллюстрация важной особенности – после обработки исключение устраняется, поэтому возможна обработка повторяющихся ошибок (например, блок try помещен в цикл).
using System;
class Demo
{
public static void Main ( )
{
int [ ] arr1 = {10,20,30,40,50,60};
int [ ] arr2 = {10,0,30,40,0,60};
22

for (int i = 0;i<arr1.Length; i++)
{
try
{
Console.WriteLine(arr1[i]+"/"+arr2[i]
+"="+arr1[i]/arr2[i]);
}
catch (DivideByZeroException)
{
// перехват исключения |
Console.WriteLine |
("деление на ноль"); |
|
} |
|
}
}
}
23

Использование нескольких блоков catch
Из общего синтаксического правила следует возможность перехвата нескольких исключений – с помощью своих блоков catch.
Проверка будет идти в соответствии с их последовательностью
Выполнится тот блок, исключение которого совпадет с возникшим.
Пример 4. Программный код из примера 3 видоизменен и позволяет продемонстрировать перехват двух разных исключений
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};
24

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

Перехват всех возможных исключений
Если не требуется конкретизировать тип исключения, можно использовать упрощенную форму блока catch – без указания класса исключения:
catch
{
//обработка исключений
}
Для примера 4 соответствующий блок может выглядеть, например, следующим образом:
catch
{
// перехват исключений
Console.WriteLine ("возникло исключение");
}
Вложенные блоки try
Допускается использование вложенных блоков try.
Внутренний блок входит во внешний вместе с соответствующим блоком (блоками) catch.
26

Алгоритм обработки исключений :
для исключения, возникшего при выполнении внутреннего блока, делается попытка обработки соответствующим catch;
если исключение не было перехвачено,
то оно распространяется на внешний блок, где для него ищется обработчик.
Обычно рекомендуется:
Во внутренних блоках обрабатывать ошибки, которые, в принципе, не препятствуют дальнейшему выполнению программы.
Внешние же блоки предназначены для более серьезных ошибок, которые не могут быть исправлены.
Часто во внешнем блоке используется catch без параметров.
Пример 5. Попытка деления на ноль приводит к исключению, обрабатываемому внутренним блоком. При этом обеспечивается продолжение выполнения программы. Исключение, связанное с выходом за границы массива, обрабатывается внешним блоком, завершающим выполнение программы.
27

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};
try
{
for (int i = 0;i<arr1.Length; i++)
{
try
{
Console.WriteLine
(arr1[i]+"/"+arr2[i]+"="+arr1[i]/arr2[i]);
}
28

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

Генерирование исключений
Наряду с автоматически генерируемыми исключениями в программах на C# может использоваться оператор throw– для явной генерации исключения.
Синтаксис этого оператора имеет вид:
throw exc_obj;
Здесь exc_obj – экземпляр класса исключений, который наследует класс Exception.
Данный объект можно задать, вызвав соответствующий конструктор:
try
{
// операторы
throw new DivideByZeroException; //генерация исключения
}
catch (DivideByZeroException)
{
// перехват исключения
Console.WriteLine ("деление на ноль");
}
30