Здесь массив numer длиннее массива denom.



int[] numer = { 4, 8, 16, 32, 64, 128, 256, 512 };

int[] denom = { 2, 0, 4, 4, 0, 8 };

 

 

for(int i=0; i < numer.Length; i++) {

try {

Console.WriteLine(numer[i] + " / " +

denom[i] + " равно " + numer[i]/denom[i]);

}

catch (DivideByZeroException) {

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

}

catch (IndexOutOfRangeException) {

Console.WriteLine("Подходящий элемент не найден.");  

Throw; // сгенерировать исключение повторно

}

}

}

}

 

class RethrowDemo {

static void Main() {  

try {

Rethrow.GenException();

}

catch(IndexOutOfRangeException) {

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

Console.WriteLine("Неисправимая ошибка - программа прервана.");

}

}

}

 

В этом примере программы ошибки из-за деления на нуль обрабатываются локально в методе GenException(), но ошибка выхода за границы массива генерируется повторно. В данном случае исключение IndexOutOfRangeException обрабатывается в методе Main().

 

 

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

 

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

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

 

try {

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

}

catch (ExcepTypel exOb) {

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

}

.

.

.

catch (ЕхсерТуре2 ехОb) {  

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

finally {

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

}

 

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

Ниже приведен пример применения блока finally.

 

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

using System;

class UseFinally {

public static void GenException(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.GenException(i);

Console.WriteLine() ;

}

}

}

 

Вот к какому результату приводит выполнение этой программы.

 

Получить 0

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

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

 

Получить 1

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

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

 

Получить 2

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

 

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

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

 

 

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

 

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

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

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

Применение всех трех упомянутых выше свойств и метода из класса Exception демонстрируется в приведенном ниже примере программы.

 

// Использовать члены класса 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


Дата добавления: 2019-02-12; просмотров: 264; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!