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

Если пользователь обнаружил в своем методе ошибку, то он может сгенерировать исключение вруч­ную, используя инструкцию throw.

Вызывающая метод программа должна быть готова обработать это исключение.

 

Формат ее записи таков:

 

throw exceptOb;

 

Элемент exceptOb — это объект класса исключений, производного от класса Exception.

 

throw передает управления в CLR.

 

 

Пример 1. Генерирование стандартного исключения.

 

using System;

 

class Class1

{

public static int Divide (int a, int b)

{

   if (b == 0)

        throw new DivideByZeroException();

   else

       return a / b;

}

}

 

class Demo

{

public static void Main()

{

       

   try

   {

       Console.WriteLine("a/b=" + Class1.Divide(4, 0));

   }

   catch (DivideByZeroException)

   {

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

   }

}

}

 

Пример 2. Генерирование пользовательского исключения.

 

// Деление пополам числа, которое должно быть четным.

using System;

 

class Class1

{

public static int Divide2(int a)

{

   if ( (float)(a / 2) > 0 )

        throw new Exception ("Число должно быть четным.");

   else

       return a / 2;

}

}

 

class Demo

{

public static void Main()

{

   try

   {

       Class1.Divide2 (3);

   }

   catch (Exception e)

   {

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

   }

}

}

 

Повторное генерирование исключений

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

Самая распространенная причина для повторного генерирования исключения — по­зволить нескольким обработчикам получить доступ к исключению.

 

Чтобы повторно сгенерировать исключение, достаточно использовать ключевое слово throw, не указывая исключения.

 

Пример.

using System;

 

class Class1

{

public static void genException()

{

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

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

 

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

   {

       try

       {

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

       }

       catch (IndexOutOfRangeException)

       {

           Console.WriteLine("Массивы имеют разную длину.");

            throw; // Генерируем исключение повторно.

       }

   }

}

}

 

class Demo

{

public static void Main()

{

   try

   {

       Class1.genException();

   }

   catch (IndexOutOfRangeException)

   {

       // Перехватываем повторно сгенерированное исключение.

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

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

       return;

   }

}

}

 

Пользовательские исключения

В С# имеется возможность обрабатывать исключения, создаваемые программистом.

Для этого достаточно определить класс как производный от класса Exception или от класса ApplicationException, "родоначальника" иерархии, зарезервированной для исключений, связанных с прикладными программами.

 

Пример 1.

 

class MyArrayException1 : ApplicationException

{

HelpLink = "Смотри файл Readme.txt";

Source = "Программа PGM1";

 

public MyArrayException1 (string Message) : base(Message)

{ }

}

 

Пример 2.

 

class MyArrayException2 : ApplicationException

{

// Реализуем стандартные конструкторы.

public MyArrayException2() : base() { }

public MyArrayException2 (string Message) : base(Message)

{ }

 

// Переопределяем метод ToString ()

public override string ToString()

{

   return Message;

}

}

 

Пример 3.

 

class MyArrayException3 : ApplicationException

{

public MyArrayException3()

                                      : base ("Выход за границу массива")

{ }

}

 

Третий пример практически ничего оригинального не вносит, поэтому вместо создания нового класса достаточно использовать существующий, например:

 

Exception myExc = new Exception ("Выход за границу массива");

throw myExc;

 

или

 

throw new Exception ("Выход за границу массива");

 

или

 

throw new IndexOutOfRangeException ("Выход за границу массива");

 

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