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


Полезное:

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


Категории:

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






Использование блока finally





Иногда требуется определить кодовый блок, который будет выполняться после выхода из блока try/catch. В частности, исключительная ситуация может возникнуть в связи с ошибкой, приводящей к преждевременному возврату из текущего метода. Но в этом методе мог быть открыт файл, который нужно закрыть, или же установлено сетевое соединение, требующее разрывания. Подобные ситуации нередки в программировании, и поэтому для их разрешения в C# предусмотрен удобный способ: воспользоваться блоком finally.

Для того чтобы указать кодовый блок, который должен выполняться после блока try/catch, достаточно вставить блок finally в конце последовательности операторов try/catch.

try

{

// Блок кода, предназначенный для обработки ошибок.

}

catch (ExcepType1 exOb)

{

// Обработчик исключения типа ExcepType1.

}

catch (ExcepType2 ехОb)

{

// Обработчик исключения типа ЕхсерТуре2.

}

.

.

.

finally

{

// Код завершения обработки исключений.

}

Блок finally будет выполняться всякий раз, когда происходит выход из блока try/catch, независимо от причин, которые к этому привели. Это означает, что если блок try завершается нормально или по причине исключения, то последним выполняется код, определяемый в блоке finally. Блок finally выполняется и в том случае, если любой код в блоке try или в связанных с ним блоках catch приводит к возврату из метода.

// Использовать блок finally.

using System;

class UseFinally

{

public static void GenExcepeion(int what)

{

int t;

int[] nums = new int[2];

Console.WriteLine("Получить " + what);

try

{

switch (what)

{

case 0:

t = 10 / what;// сгенерировать ошибку из-за деления на нуль

break;

case 1:

nums[4] = 4; // сгенерировать ошибку индексирования массива

break;

case 2:

return; // возврат из блока try

}

}

catch (DivideByZeroException)

{

Console.WriteLine("Делить на нуль нельзя!");

return; // возврат из блока catch

}

catch (IndexOutOfRangeException)

{

Console.WriteLine("Совпадающий элемент не найден.");

}

finally

{

Console.WriteLine("После выхода из блоа try.");

}

}

}

class FinallyDemo

{

static void Main()

{

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

{

UseFinally.GenExcepeion(i);

Console.WriteLine();

}

}

}

Получить 0

Делить на нуль нельзя

После выхода из блока try.

Получить 1

Совпадающий элемент не найден.

После выхода из блока try.

Получить 2

После выхода из блока try.

И еще одно замечание: с точки зрения синтаксиса блок finally следует после блока try, и формально блоки catch для этого не требуются. Следовательно, блок finally можно ввести непосредственно после блока try, опустив блоки catch. В этом случае блок finally начнет выполняться сразу же после выхода из блока try, но исключения обрабатываться не будут.

Подробное рассмотрение класса Exception

В классе Exception определяется ряд свойств. К числу самых интересных относятся три свойства: Message, StackTrace и TargetSite. Все эти свойства доступны только для чтения. Свойство Message содержит символьную строку, описывающую характер ошибки; свойство StackTrac e— строку с вызовами стека, приведшими к исключительной ситуации, а свойство TargetSite получает объект, обозначающий метод, сгенерировавший исключение.

Кроме того, в классе Exception определяется ряд методов. Чаще всего приходится пользоваться методом ToString(), возвращающим символьную строку с описанием исключения. Этот метод автоматически вызывается, например, при отображении исключения с помощью метода WriteLine().

// Использовать члены класса Exception.

using System;

class ExcTest

{

public static void GenException()

{

int[] nums = new int[4];

Console.WriteLine("До генерирования исключения.");

// Сгенерировать исключение в связи с выходом за границы массива.

for (int i = 0; i < 10; i++)

{

nums[i] = i;

Console.WriteLine("nums[{0}]: {1}", i, nums[i]);

}

Console.WriteLine("He подлежит выводу");

}

}

class UseExcept

{

static void Main()

{

try

{

ExcTest.GenException();

}

catch (IndexOutOfRangeException exc)

{

Console.WriteLine("Стандартное сообщение таково: ");

Console.WriteLine(exc);// вызвать метод ToString()

Console.WriteLine("Свойство StackTrace: " + exc.StackTrace);

Console.WriteLine("Свойство Message: " + exc.Message);

Console.WriteLine("Свойство TargetSite: " + exc.TargetSite);

}

Console.WriteLine("После блока перехвата исключения.");

}

}

До генерирования исключения.

nums[0]: 0

nums[1]: 1

nums[2]: 2

nums[3]: 3

Стандартное сообщение таково: System.IndexOutOfRangeException:

Индекс находился вне границ массива.

в ExcTest.genException() в <имя_файла>:строка 15

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

Свойство StackTrace: в ExcTest.genException() в <имя_файла>:строка 15

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

Свойство Message: Индекс находился вне границ массива.

Свойство TargetSite: Void genException()

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

 

В классе Exception определяются четыре следующих конструктора.

public Exception()

public Exception(string сообщение )

public Exception(string сообщение, Exception внутреннее_исключение )

protected Exception(System.Runtime.Serialization.SerializationInfo информация,

System.Runtime.Serialization.StreamingContext контекст )

Первый конструктор используется по умолчанию. Во втором конструкторе указывается строка сообщение, связанная со свойством Message, которое имеет отношение к генерируемому исключению. В третьем конструкторе указывается так называемое внутреннее исключение. Этот конструктор используется в том случае, когда одно исключение порождает другое, причем внутреннее_исключение обозначает первое исключение, которое будет пустым, если внутреннее исключение отсутствует. (Если внутреннее исключение присутствует, то оно может быть получено из свойства InnerException, определяемого в классе Exception.) И последний конструктор обрабатывает исключения, происходящие дистанционно, и поэтому требует десериализации.

Следует также заметить, что в четвертом конструкторе класса Exception типы SerializationInfo и StreamingContext относятся к пространству имен System.Runtime.Serialization.

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



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