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

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

<b>      catch (DivideByZeroException) {</b>

<b>        Console.WriteLine(&quot;Делить на нуль нельзя!&quot;);</b>

<b>      }</b>

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

<b>        Console.WriteLine(&quot;Подходящий элемент не найден.&quot;); </b>

<b>        throw; // сгенерировать исключение повторно</b>

<b>      }</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

<b>class RethrowDemo {</b>

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

<b>    try {</b>

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

<b>    }</b>

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

<b>      // перехватить исключение повторно</b>

<b>      Console.WriteLine(&quot;Неисправимая ошибка - программа прервана.&quot;);</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

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

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

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

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

<b>try {</b>

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

<b>}</b>

<b>catch <i>(ExcepTypel exOb)</i> {</b>

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

<b>}</b>

<b>.</b>

<b>.</b>

<b>.</b>

<b>catch (<i>ЕхсерТуре2 ехОb) {</i></b>

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

<b>finally {</b>

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

<b>}</b>

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

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

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

<b>using System;</b>

<b>class UseFinally {</b>

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

<b>    int t;</b>

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

<b>    Console.WriteLine(&quot;Получить &quot; + what); </b>

<b>    try {</b>

<b>      switch(what) { </b>

<b>      case 0:</b>

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

<b>        break; </b>

<b>      case 1:</b>

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

<b>        break;</b>

<b>      case 2:</b>

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

<b>      }</b>

<b>    }</b>

<b>    catch (DivideByZeroException) {</b>

<b>      Console.WriteLine(&quot;Делить на нуль нельзя!&quot;);</b>

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

<b>    }</b>

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