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

Оператор 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