На этом шаге мы рассмотрим еще один пример использования исключений.
В следующем примере обработка исключений используется для прекращения работы циклической конструкции. Рассмотрим следующую программу:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr230_1 { // Класс с индексатором: class MyClass { // Закрытое поле - ссылка на массив: private int[] nums; // Конструктор: public MyClass(int size) { nums = new int[size]; } // Индексатор: public int this [int k] { // Аксессор для считывания значения: get { return nums[k]; } // Аксессор для присваивания значения: set { nums[k] = value; } } } // Главный класс: class Program { // Метод для отображения значений элементов // массива из объекта: static void show(MyClass obj) { // Целочисленная переменная: int k = 0; // Контролируемый блок: try { // Конструкция цикла: while(true) { // Отображение значения элемента массива: Console.Write("|" + obj[k]); // Увеличение значения индексной переменной: k++; } } // Обработка исключений: catch(IndexOutOfRangeException) { Console.WriteLine("|"); } } // Главный метод: static void Main() { // Создание объекта класса: MyClass obj = new MyClass(10); // Целочисленная переменная: int k = 0; // Контролируемый код: try { // Циклическая конструкция: do { // Присваивание значения элементу массива // в объекте: obj[k] = 2 * k + 1; // Увеличение значения индексной переменной: k++; } while(true); } // Обработка исключений: catch(IndexOutOfRangeException) { // Отображение содержимого массива из объекта: show(obj); } // Задержка: Console.ReadLine(); } } }
Результат выполнения программы такой:
Рис.1. Результат выполнения программы
В этом примере мы описали класс MyClass, в котором есть закрытое поле nums, являющееся ссылкой на целочисленный массив. Массив создается при вызове конструктора. Аргументом конструктору передается число, определяющее размер массива. Для доступа к элементам массива используется индексатор. Проблема в том, что массив закрытый, но в классе не определены свойство или метод, которые позволили бы узнать размер массива.
В главном классе описан статический метод show(), который не возвращает результат. Аргументом методу передается объект класса MyClass. Метод предназначен для отображения содержимого массива из объекта, переданного методу в качестве аргумента. Для этого в try-блоке запускается формально бесконечный цикл while. За каждую итерацию цикла отображается значение проиндексированного объекта (значение элемента массива из объекта), и индекс увеличивается на единицу. Как только будет предпринята попытка считать значение несуществующего элемента, будет сгенерировано исключение класса IndexOutOfRangeException. Как следствие, выполнение конструкции цикла прекращается, а исключение обрабатывается в catch-блоке.
В главном методе командой
MyClass obj = new MyClass(10);
obj[k] = 2 * k + 1;
k++;
show(obj);
На следующем шаге мы продолжим изучение этого вопроса.