Добавить в цитаты Настройки чтения

Страница 192 из 502

<b>      Console.WriteLine(&quot;Совпадающий элемент не найден.&quot;);</b>

<b>    }</b>

<b>    finally {</b>

<b>      Console.WriteLine(&quot;После выхода из блока try.&quot;);</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

<b>class FinallyDemo {</b>

<b>  static void Main() {</b>

<b>    for(int i=0; i &lt; 3; i++) {</b>

<b>      UseFinally.GenException(i);</b>

<b>      Console.WriteLine() ;</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

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

<b>Получить 0</b>

<b>Делить на нуль нельзя </b>

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

<b>Получить 1</b>

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

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

<b>Получить 2</b>

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

Как следует из приведенного выше результата, блок 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 демонстрируется в приведенном ниже примере программы.

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

<b>using System;</b>

<b>class ExcTest {</b>

<b>  public static void GenException() {</b>

<b>    int[] nums = new int [4];</b>

<b>    Console.WriteLine(&quot;До генерирования исключения.&quot;);</b>

<b>    // Сгенерировать исключение в связи </b>

<b>    //с выходом за границы массива, </b>

<b>    for(int i=0; i &lt; 10; i++) {</b>

<b>      nums[i] = i;</b>

<b>      Console.WriteLine(&quot;nums[{0}]: {1}&quot;, i, nums[i]);</b>

<b>    }</b>

<b>    Console.WriteLine(&quot;He подлежит выводу&quot;);</b>

<b>  }</b>

<b>}</b>

<b>class UseExcept {</b>

<b>  static void Main() { </b>

<b>    try {</b>

<b>      ExcTest.GenException();</b>

<b>    }</b>

<b>    catch (IndexOutOfRangeException exc) {</b>

<b>      Console.WriteLine(&quot;Стандартное сообщение таково: &quot;);</b>

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

<b>      Console.WriteLine(&quot;Свойство StackTrace: &quot; + exc.StackTrace);</b>

<b>      Console.WriteLine(&quot;Свойство Message: &quot; + exc.Message);</b>

<b>      Console.WriteLine(&quot;Свойство TargetSite: &quot; + exc.TargetSite);</b>