Страница 189 из 502
<b>catch {</b>
<b> // обработка исключений</b>
<b>}</b>
С помощью такой формы создается "универсальный" обработчик всех исключений, перехватываемых в программе.
Ниже приведен пример такого "универсального" обработчика исключений. Обратите внимание на то, что он перехватывает и обрабатывает оба исключения, IndexOutOfRangeException и DivideByZeroException, генерируемых.в программе.
<b>// Использовать "универсальный" обработчик исключений.</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 < numer.Length; i++) {</b>
<b> try {</b>
<b> Console.WriteLine(numer[i] + " / " +</b>
<b> denom[i] + " равно " + numer[i]/denom[i]);</b>
<b> }</b>
<b> catch { // "Универсальный" перехват.</b>
<b> Console.WriteLine ("Возникла некоторая исключительная ситуация.");</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 < numer.Length; i++) {</b>
<b> try { // вложенный блок try</b>
<b> Console.WriteLine(numer[i] + " / " +</b>
<b> denom[i] + " равно " + numer[i]/denom[i]);</b>
<b> }</b>
<b> catch (DivideByZeroException) {</b>
<b> Console.WriteLine("Делить на нуль нельзя!");</b>
<b> }</b>
<b> }</b>
<b> }</b>
<b> catch (IndexOutOfRangeException) {</b>
<b> Console.WriteLine("Подходящий элемент не найден.");</b>
<b> Console.WriteLine("Неисправимая ошибка - программа прервана.");</b>
<b> }</b>
<b> }</b>
<b>}</b>
Выполнение этой программы приводит к следующему результату.
<b>4/2 равно 2 </b>
<b>Делить на нуль нельзя!</b>
<b>16/4 равно 4 </b>
<b>32/4 равно 8 </b>