Свойства и методы класса Exception
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Конструкторы (2 из 4):

 

1. Инициализирует новый экземпляр класса Exception.

 

 public Exception();

 

2. Инициализирует новый экземпляр класса Exception с заданным сообщением об ошибке.

 

public Exception (string);

[C++] public: Exception(String*);

[JScript] public function Exception(String);

 

В классе Exception определен ряд свойств:

 

Message Содержит строку, которая описывает причину ошибки
StackTrace Содержит имя класса и метода, вызвавшего исключение
TargetSite Содержит имя метода, из которого было вызвано исключение
Source Содержит имя программы, вызвавшей ис­ключение
HelpLink Строка с любой дополнительной информацией

 

Методы:

Метод ToString() возвращает строку с описанием исключения.

 

Пример 1:

 

try

{

double d = double.Parse(Console.ReadLine());

}

catch (Exception e)

{

Console.WriteLine ("Полное описание: "        + e); //вызов ToString

Console.WriteLine ("Сообщение об ошибке: "  + e.Message);

Console.WriteLine ("Имя класса и метода: "     + e.StackTrace);

Console.WriteLine ("Метод: "                                     + e.TargetSite);

}

 

Пример 2:

 

public static void Main()

{

   int[ ] а = new int[4];

 

   try

   {

       for ( int i = 0; i < 10; i++)

           а[i] = i;

   }

       

  catch (IndexOutOfRangeException)

   {

      Console.WriteLine ("Индекс вне диапазона!");

       return;

   }

}

 

Пример 3:

 

public static void Main()

{

   try

   {

       Class1.Divide(a, b);

   }

 

   catch (DivideByZeroException)

   {

       Console.WriteLine("Делитель равен 0");

       b = 1;

   }

}

 

Пример 4.

 

public static void Main()

{

   try

   {

       double c = double.Parse(Console.ReadLine());

   }

 

   catch (Exception e)

   {

       Console.WriteLine("Error: " + e.Message);

       return;

   }

}

 

Использование нескольких catch-блоков

С try-блоком можно связать не один, а несколько catch-блоков.

 

Однако все catch- блоки должны перехватывать исключения различного типа.

 

using System;

class Demo

{

public static void Main()

{

   // Здесь массив a длиннее массива b.

   int[] a = { 4, 8, 10, 32, 64, 128, 256, 512 };

   int[] b = { 2, 0, 1, 4, 0, 8 };

 

 

   for (int i = 0; i < a.Length; i++)

   {

       try

       {

           Console.WriteLine(a[i] + " / " + b[i] + " равно " + a[i] / b[i]);

       }

 

       catch (DivideByZeroException)

       {

           Console.WriteLine("Деление на ноль!");

         }

 

       catch (IndexOutOfRangeException)

       {

           Console.WriteLine("Выход за границы массива.");

           return;

       }

   }

}

}

 

 

В общем случае catch-выражения проверяются в том порядке, в котором они встречаются в программе.

 Выполняется только инструкция, тип исключения которой совпадает со сгенерированным исключением. Все остальные catch-блоки игнориру­ются.

 

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

 

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

Один try-блок можно вложить в другой. Исключение, сгенерированное во внут­реннем try-блоке и не перехваченное catch-инструкцией, которая связана с этим try-блоком, передается во внешний try-блок.

 

Пример.

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

 

using System;

class Demo

{

public static void Main()

{

   // Здесь массив a длиннее массива b.

   int[] a = { 4, 8, 16, 32, 64, 128, 256, 512 };

   int[] b = { 2, 0, 4, 4, 0, 8 };

 

 

   try

   {  // Внешний try-блок.

       for (int i = 0; i < a.Length; i++)

       {

           try

           {      // Вложенный try-блок.

               Console.WriteLine (a[i] + " / " + b[i] + " = " + a[i] / b[i]);

           }

           catch (DivideByZeroException)

           {

               Console.WriteLine ("На ноль делить нельзя!");

           }

       }

     }

 

   catch (IndexOutOfRangeException)

   {

       Console.WriteLine ("Нет соответствующего элемента.");

       Console.WriteLine ("Неисправимая ошибка. " +

                                         "Программа завершена.");

       return;

   }

. . . . . . . . . .

}

}

 

Исключение, которое может быть обработано внутренним try-блоком (в данном случае это деление на нуль), позволяет программе продолжать работу.

 

Однако нару­шение границ массива перехватывается внешним try-блоком и заставляет программу завершиться.

 

Внешние try-блоки можно также использовать в качестве механизма "глобаль­ного перехвата" для обработки тех ошибок, которые не перехватываются внутренними блоками.

 

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

Возникновение и обработка исключения, как правило, приводит к нетипичному завершению программы. При этом в программе могут остаться неосвобожденные ресурсы, например, открытые файлы.

 

Для освобождения ресурсов используют блок finally.

Этот блок должен следовать за блоком try или catch. Последний является необязательным.

Формат:

try

{

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

}

catch (ExcepTypel exOb)

{

// Обработчик для исключения типа ExcepTypel.

}

catch (ExcepType2 exOb)

{

// Обработчик для исключения типа ЕхсерТуре2.

}

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

finally

{

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

}

 

Блок finally будет выполнен в любом случае – было сгенерировано исключение или нет. 

Блок finally не может быть определен без блока try. Эта пара (как правило, с блоками catch) может находиться и внутри вызываемого метода.

В одной программе (методе) может быть несколько блоков finally. Все эти блоки будут выполнены после своих try-блоков.

 

Пример.

public static void Main()

{

try

{

   double c = double.Parse(Console.ReadLine());

}

catch (Exception e)

{

   Console.WriteLine("Error: " + e.Message);

   return;

}

finally

{

   Console.WriteLine("Здесь освобождаются ресурсы." +

                                            "Блок выполняется всегда");

}

}

 

Дата: 2019-02-02, просмотров: 236.