Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Перехват исключений производных классов





При попытке перехватить типы исключений, относящихся как к базовым, так и к производным классам, следует особенно внимательно соблюдать порядок следования операторов catch, поскольку перехват исключения базового класса будет совпадать с перехватом исключений любых его производных классов. Например, класс Exception является базовым для всех исключений, и поэтому вместе с исключением типа Exception могут быть перехвачены и все остальные исключения производных от него классов. Конечно, для более четкого перехвата всех исключений можно воспользоваться упоминавшейся ранее формой оператора catch без указания конкретного типа исключения. Но вопрос перехвата исключений производных классов становится весьма актуальным и в других ситуациях, особенно при создании собственных исключений.

Если требуется перехватывать исключения базового и производного классов, то первым по порядку должен следовать оператор catch, перехватывающий исключение производного класса. Это правило необходимо соблюдать потому, что при перехвате исключения базового класса будут также перехвачены исключения всех производных от него классов. Правда, это правило соблюдается автоматически: если первым расположить в коде оператор catch, перехватывающий исключение базового класса, то во время компиляции этого кода будет выдано сообщение об ошибке.

// Исключения производных классов должны появляться до

// исключений базового класса.

using System;

// Создать класс исключения.

class ExceptA: Exception

{

public ExceptA(string str): base(str) { }

public override string ToString()

{

return Message;

}

}

// Создать класс исключения, производный от класса ExceptA.

class ExceptB: ExceptA

{

public ExceptB(string str): base(str) { }

public override string ToString()

{

return Message;

}

}

class OrderMatters

{

static void Main()

{

for (int x = 0; x < 3; x++)

{

try

{

if (x == 0) throw new ExceptA("Перехват исключения типа ExceptA");

else if (x == 1) throw new ExceptB("Перехват исключения типа ExceptB");

else throw new Exception();

}

catch (ExceptB exc)

{

Console.WriteLine(exc);

}

catch (ExceptA exc)

{

Console.WriteLine(exc);

}

catch (Exception exc)

{

Console.WriteLine(exc);

}

}

}

}

Перехват исключения типа ExceptA.

Перехват исключения типа ExceptB.

System.Exception: Выдано исключение типа "System.Exception".

в OrderMatters.Main() в <имя_файла>:строка 36

 

Обратите внимание на порядок следования операторов catch. Именно в таком порядке они и должны выполняться. Класс ExceptB является производным от класса ExceptA, поэтому исключение типа Except B должно перехватываться до исключения типа ExceptA. Аналогично, исключение типа Exception (т.е. базового класса для всех исключений) должно перехватываться последним. Для того чтобы убедиться в этом, измените порядок следования операторов catch. В итоге это приведет к ошибке во время компиляции.

Применение ключевых слов checked и unchecked

В C# имеется специальное средство, связанное с генерированием исключений, возникающих при переполнении в арифметических вычислениях. Как вам должно быть уже известно, результаты некоторых видов арифметических вычислений могут превышать диапазон представления чисел для типа данных, используемого в вычислении. В этом случае происходит так называемое переполнение. Рассмотрим в качестве примера следующий фрагмент кода.

byte a, b, result;

a = 127;

b = 127;

result = (byte)(a * b);

В этом коде произведение значений переменных а и b превышает диапазон представления чисел для типа byte. Следовательно, результат вычисления данного выражения приводит к переполнению для типа данных, сохраняемого в переменной result.

В C# допускается указывать, будет ли в коде сгенерировано исключение при переполнении, с помощью ключевых слов checked и unchecked. Так, если требуется указать, что выражение будет проверяться на переполнение, следует использовать ключевое слово checked, а если требуется проигнорировать переполнение — ключевое слово unchecked. В последнем случае результат усекается, чтобы не выйти за пределы диапазона представления чисел для целевого типа выражения.

У ключевого слова checked имеются две общие формы. В одной форме проверяется конкретное выражение, и поэтому она называется операторной. А в другой форме проверяется блок операторов, и поэтому она называется блочной. Ниже приведены обе формы:

checked (выражение)

 

checked

{

// проверяемые операторы

}

где выражение обозначает проверяемое выражение. Если вычисление проверяемого выражения приводит к переполнению, то генерируется исключение OverflowException.

У ключевого слова unchecked также имеются две общие формы. В первой, операторной форме переполнение игнорируется при вычислении конкретного выражения. А во второй, блочной форме оно игнорируется при выполнении блока операторов:

unchecked (выражение)

 

unchecked

{

// операторы, для которых переполнение игнорируется

}

где выражение обозначает конкретное выражение, при вычислении которого переполнение игнорируется. Если же в непроверяемом выражении происходит переполнение, то результат его вычисления усекается.

// Продемонстрировать применение ключевых слов checked и unchecked.

using System;

class CheckedDemo

{

static void Main()

{

byte a, b;

byte result;

a = 127;

b = 127;

try

{

result = unchecked((byte)(a * b));

Console.WriteLine("Непроверенный на переполнение результат: " + result);

result = checked((byte)(a * b)); // эта операция приводит к

// исключительной ситуации

Console.WriteLine("Проверенный на переполнение результат: " +

result); //не подлежит выполнению

}

catch (OverflowException exc)

{

Console.WriteLine(exc);

}

}

}

Непроверенный на переполнение результат: 1

System.OverflowException: Переполнение в результате

выполнения арифметической операции.

в CheckedDemo.Main() в <имя_файла>:строка 20

 

// Продемонстрировать применение ключевых слов checked

// и unchecked в блоке операторов.

using System;

class CheckedBlocks

{

static void Main()

{

byte a, b;

byte result;

a = 127;

b = 127;

try

{

unchecked

{

a = 127;

b = 127;

result = unchecked((byte)(a * b));

Console.WriteLine("Непроверенный на переполнение результат: " + result);

a = 125;

b = 5;

result = unchecked((byte)(a * b));

Console.WriteLine("Непроверенный на переполнение результат: " + result);

}

checked

{

a = 2;

b = 7;

result = checked((byte)(a * b)); // верно

Console.WriteLine("Проверенный на переполнение результат: " + result);

a = 127;

b = 127;

result = checked((byte)(a * b)); // эта операция приводит к

// исключительной ситуации

Console.WriteLine("Проверенный на переполнение результат: " +

result); // не подлежит выполнению

}

}

catch (OverflowException exc)

{

Console.WriteLine(exc);

}

}

}

ГЛАВА

Date: 2015-09-02; view: 419; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию