На этом шаге мы перечислим эти классы и приведем небольшой пример их использования.
Как отмечалось на предыдущих шагах, существует целая иерархия классов, описывающих различные исключительные ситуации. Большинство практически важных классов исключений содержатся в пространстве имен System. На вершине иерархии наследования классов находится класс Exception. Производными от класса Exception являются классы SystemException и ApplicationException. Класс SystemException является базовым для классов исключений, соответствующих системным ошибкам. Класс ApplicationException обычно используют для создания пользовательских исключений (этот вопрос мы рассмотрим немного позже). В таблице 1 приведены некоторые классы исключений, которые нередко используются на практике.
Класс | Описание |
---|---|
ArgumentException | Исключение, связанное с некорректным аргументом |
ArithmeticException | Исключение, связанное с выполнением арифметических операций. У этого класса имеется три производных класса:
|
ArrayTypeMismatchException | Исключение, связанное с попыткой записать в массив значение недопустимого типа |
FormatException | Исключение, обусловленное недопустимым форматом |
IndexOutOfRangeException | Исключение, связанное с выходом индекса за допустимые пределы |
InvalidCastException | Исключение, обусловленное недопустимым преобразованием типов |
InvalidProgramException | Исключение, связанное с неправильной компиляцией программы |
MemberAccessException | Исключение, обусловленное неудачной попыткой доступа к члену класса. У класса этого исключения есть три производных класса:
|
NotImplementedException | Исключение, связанное с попыткой выполнить нереализованный метод или операцию |
NotSupportedException | Исключение, связанное с попыткой выполнения неподдерживаемого метода или операции |
NullReferenceException | Исключение, связанное с использованием пустой ссылки |
OutOfMemoryException | Исключение, связанное с недостаточным объемом памяти |
RankException | Исключение, связанное с передачей массива неправильной размерности |
StackOverflowException | Исключение, связанное с переполнением стека |
TimeoutException | Исключение, связанное с окончанием времени, выделенного на выполнение процесса или операции |
Конечно, это лишь небольшая часть классов исключений. В действительности иерархия классов наследования более чем обширна, она содержит самые разнообразные классы, так сказать, "на все случаи жизни". Конкретные классы мы будем использовать и обсуждать по мере необходимости. А далее рассмотрим пример, в котором при выполнении программы генерируются (и обрабатываются) исключения разных типов. Обратимся к программному коду:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr222_1 { // Класс с главным методом: class Program { // Главный метод: static void Main() { // Объект для генерации случайных чисел: Random rnd = new Random(); // Переменная массива: int[] nums; // Целочисленные переменные: int x, n; // Конструкция цикла: for (int k = 1; k < 10; k++) { // Отображение номера итерации цикла: Console.Write("[{0}] ", k); // Начальное значение переменной (номер команды): n = 1; // Контролируемый блок кода: try { // Команда №1. Попытка создать массив: nums = new int[2 * rnd.Next(3) - 1]; // Увеличение значения счетчика команд: n++; // Команда №2. Попытка вычислить частное: x = 1 / rnd.Next(3); // Увеличение значения счетчика команд: n++; // Команда №3. Попытка присвоить значение // элементу массива: nums[rnd.Next(2) - 1] = x; // Увеличение значения счетчика команд: n++; // Команда №4. Ошибка преобразования: nums[0] = Int32.Parse("ноль"); } // Блок обработки исключений: catch (Exception e) { // Отображение номера команды с ошибкой: Console.Write("Команда №{0}: ", n); // Отображение типа (класса) исключения: Console.Write(e.GetType().Name); // Отображение описания для исключения: Console.WriteLine(" - " + e.Message); } } // Задержка: Console.ReadLine(); } } }
Возможный результат выполнения программы (с поправкой на то, что используется генератор случайных чисел) представлен ниже:
Рис.1. Результат выполнения программы
Программа, в общем-то, простая. В главном методе командой
Random rnd = new Random();
Затем запускается цикл, в котором индексная переменная k последовательно принимает значения от 1 до 9 включительно. В начале цикла командой
Console.Write("[{0}] ", k);
n = 1;
n++ .
Итак, сначала командой
nums = new int[2 * rnd.Next(3) - 1];
x = 1 / rnd.Next(3); .
nums[rnd.Next(2) - 1] = x; .
nums[0] = Int32.Parse("ноль");
Таким образом, при выполнении команд тела цикла точно генерируется исключение одного из четырех упомянутых выше типов. Такое исключение перехватывается и обрабатывается в catch-блоке. В нем отображается номер команды, при выполнении которой возникла ошибка (значение переменной n), класс исключения (выражение e.GetType().Name), а также описание возникшей ошибки (выражение e.Message).
На следующем шаге мы рассмотрим спользование нескольких catch-блоков.