Если пользователь обнаружил в своем методе ошибку, то он может сгенерировать исключение вручную, используя инструкцию 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.