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

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

<b>catch {</b>

<b>  // обработка исключений</b>

<b>}</b>

С помощью такой формы создается "универсальный" обработчик всех исключений, перехватываемых в программе.

Ниже приведен пример такого "универсального" обработчика исключений. Обратите внимание на то, что он перехватывает и обрабатывает оба исключения, IndexOutOfRangeException и DivideByZeroException, генерируемых.в программе.

<b>// Использовать &quot;универсальный&quot; обработчик исключений.</b>

<b>using System;</b>

<b>class ExcDemo5 {</b>

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

<b>    // Здесь массив numer длиннее массива denom.</b>

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

<b>    int[] denom = { 2, 0, 4, 4, 0, 8 };</b>

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

<b>      try {</b>

<b>        Console.WriteLine(numer[i] + &quot; / &quot; +</b>

<b>              denom[i] + &quot; равно &quot; + numer[i]/denom[i]);</b>

<b>      }</b>

<b>      catch { // &quot;Универсальный&quot; перехват.</b>

<b>        Console.WriteLine (&quot;Возникла некоторая исключительная ситуация.&quot;);</b>

<b>      }</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

При выполнении этой программы получается следующий результат.

<b>4/2 равно 2 </b>

<b>Возникла некоторая исключительная ситуация. </b>

<b>16/4 равно 4 </b>

<b>32/4 равно 8 </b>

<b>Возникла некоторая исключительная ситуация. </b>

<b>128 / 8 равно 16 </b>

<b>Возникла некоторая исключительная ситуация. </b>

<b>Возникла некоторая исключительная ситуация. </b>

Применяя "универсальный" перехват, следует иметь в виду, что его блок должен располагаться последним по порядку среди всех блоков catch.

-------------------------------------

ПРИМЕЧАНИЕ

В подавляющем большинстве случаев “универсальный” обработчик исключений не применяется. Как правило, исключения, которые могут быть сгенерированы в коде, обрабатываются по отдельности. Неправильное использование “универсального" обработчика может привести к тому, что ошибки, перехватывавшиеся при тестировании программы, маскируются. Кроме того, организовать надлежащую обработку всех исключительных ситуаций в одном обработчике не так-то просто. Иными словами, “универсальный" обработчик исключений может оказаться пригодным лишь в особых случаях, например в инструментальном средстве анализа кода во время выполнения.

--------------------------------------

Вложение блоков try

Один блок try может быть вложен в другой. Исключение, генерируемое во внутреннем блоке try и не перехваченное в соответствующем блоке catch, передается во внешний блок try. В качестве примера ниже приведена программа, в которой исключение IndexOutOfRangeException перехватывается не во внутреннем, а во внешнем блоке try.

<b>// Использовать вложенный блок try.</b>

<b>using System;</b>

<b>class NestTrys {</b>

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

<b>    // Здесь массив numer длиннее массива denom.</b>

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

<b>    int[] denom = { 2, 0, 4, 4, 0, 8  };</b>

<b>    try {  // внешний блок    try</b>

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

<b>        try { // вложенный блок try</b>

<b>          Console.WriteLine(numer[i] + &quot; / &quot; +</b>

<b>                denom[i] + &quot; равно &quot; + numer[i]/denom[i]);</b>

<b>        }</b>

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

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

<b>        }</b>

<b>      }</b>

<b>    }</b>

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

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

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

<b>    }</b>

<b>  }</b>

<b>}</b>

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

<b>4/2 равно 2 </b>

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

<b>16/4 равно 4 </b>

<b>32/4 равно 8 </b>