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

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