Страница 191 из 502
<b> catch (DivideByZeroException) {</b>
<b> Console.WriteLine("Делить на нуль нельзя!");</b>
<b> }</b>
<b> catch (IndexOutOfRangeException) {</b>
<b> Console.WriteLine("Подходящий элемент не найден."); </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("Неисправимая ошибка - программа прервана.");</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("Получить " + 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("Делить на нуль нельзя!");</b>
<b> return; // возврат из блока catch</b>
<b> }</b>
<b> catch (IndexOutOfRangeException) {</b>