Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тюмгу / Лекции КБ ИБАС 1 курс 2 семестр / лекция15 Безопасность 2018.pptx
Скачиваний:
11
Добавлен:
08.12.2019
Размер:
351.87 Кб
Скачать

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