Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Лекция 7. Обработка исключительных ситуаций

Классы коллекций

Классы коллекций делятся на три основных категории: общего назначения, специализированные и ориентированные на побитовую организацию данных. Классы общего назначения можно использовать для хранения объектов любого типа. Битовые предназначены для хранения битовой информации. Коллекции специального назначения разрабатываются для обработки данных конкретного типа. В данной работе рассматриваются только классы коллекций общего назначения. Эти ые и ориентированные на побитовую организациюклассы перечислены в таблице:

 

Класс Описание
ArrayList Динамический массив, т.е массив, который при необходимости может увеличивать свой размер
HashTable Хеш-таблица для пар ключ/значение
Queue Очередь
SortedList Отсортированный список пар ключ/значение
Stack Стек

 

Класс ArrayList предназначен для поддержки динамических массивов, которые при необходимости могут увеличиваться или сокращаться. Объект этого класса представляет собой массив переменной длины, элементами которого являются объектные ссылки. Любой объект класса ArrayList создается с некоторым начальным размером. При превышении этого размера коллекция автоматически его увеличивает. В случае удаления объектов массив можно сократить.

Класс ArrayList реализует интерфейсы ICollection, IList, IEnumerable и ICloneable. В классе определены следующие конструкторы:

 

Прототип конструктора Описание
public ArrayList() Создает пустой ArrayList-массив с начальной емкостью в 16 элементов
public ArrayList (ICollection c) Создает массив, который инициализируется элементами и емкостью коллекции c
public ArrayList (int capacity) Создает массив с заданной начальной емкостью

 

Помимо методов, определенных в интерфейсах, которые реализует класс ArrayList, в нем определены и собственные методы:

 

Метод Описание
public virtual void AddRange(ICollection c) Добавляет элементы из коллекции c в конец вызывающей коллекции
public virtual int BinarySearch(object v) Выполняет поиск элемента v. Возвращает его индекс или отрицательное значение, если элемента нет. Вызывающий список должен быть отсортирован
public virtual int BinarySearch(object v, IComparer comp) Выполняет поиск элемента v на основе метода сравнения объектов, заданного параметром comp. Возвращает индекс элемента или отрицательное значение, если элемента нет. Вызывающий список должен быть отсортирован
public virtual int BinarySearch(int startIdx, int count, object v, IComparer comp) Выполняет поиск элемента v на основе метода сравнения объектов, заданного параметром comp. Поиск начинается с элемента startIdx и включает count элементов. Возвращает индекс элемента или отрицательное значение, если элемента нет. Вызывающий список должен быть отсортирован
public virtual void CopyTo(Array ar, int startIdx) Копирует содержимое вызывающей коллекции, начиная с элемента с индексом startIdx, в массив ar
public virtual void CopyTo(int srcIdx, Array ar, int destIdx, int count) Копирует count элементов вызывающей коллекции, начиная с индекса startIdx, в массив ar, начиная с элемента с индексом destIdx
public virtual ArrayList GetRange(int idx, int count) Возвращает часть вызывающей коллекции. Диапазон начинается с индекса idx и включает count элементов.
public static ArrayList FixedSize(ArrayList ar) Превращает коллекцию ar в ArrayList-массив с фиксированным размером и возвращает результат
public virtual void InsertRange(int startIdx,ICollection c) Вставляет элементы коллекции c в вызывающую коллекцию, начиная с индекса startIdx
public virtual int LastIndexOf(object v) Возвращает индекс последнего вхождения объекта v в вызывающую коллекцию (-1, если объект не обнаружен)
public static ArrayList ReadOnly(ArrayList ar) Превращает коллекцию ar в ArrayList-массив, предназначенный только для чтения, и возвращает результат
public virtual void RemoveRange(int idx, int count) Удаляет count элементов из вызывающей коллекции, начиная с элемента с индексом idx
public virtual void Reverse() Располагает элементы вызывающей коллекции в обратном порядке
public virtual void Reverse(int startIdx, int count) Располагает в обратном порядке count элементов вызывающей коллекции, начиная с индекса startIdx
public virtual void SetRange(int startIdx, ICollection c) Заменяет элементы вызывающей коллекции, начиная с индекса startIdx, элементами коллекции c
public virtual void Sort() Сортирует коллекцию по возрастанию
public virtual void Sort(IComparer comp) Сортирует вызывающую коллекцию на основе метода сравнения объектов comp
public virtual void Sort(int startIdx, int endIdx, IComparer comp) Сортирует часть вызывающей коллекции на основе метода сравнения объектов comp. Сортировка начинается с индекса startIdxи заканчивается индексом endIdx
public static ArrayList Synchronized(ArrayList list) Возвращает синхронизированную версию вызывающей коллекции
public virtual object[] ToArray() Возвращает массив, который содержит копии элементов вызывающего объекта
public virtual Array ToArray(Type type) Возвращает массив, который содержит копии элементов вызывающего объекта. Тип элементов в этом массиве задается параметром type
public virtual void TrimToSize() Устанавливает свойство Capacity равным значению свойства Count

 

Помимо свойств, определенных в интерфейсах, реализуемых классом ArrayList, в нем также определено свойство Capacity:

public virtual int Capacity { get; set; }

Оно позволяет узнать или установить емкость вызывающего массива. Емкость – это количество элементов, которые можно сохранить в массиве без его увеличения.

 

Класс HashTable предназначен для создания коллекции, в которой для хранения объектов используется хеш-таблица. Этотклассреализуетинтерфейсы IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallBack и ICloneable.

В классе HashTable определено множество конструкторов, включая следующие (они используются чаще всего):

 

Прототип конструктора Описание
public HashTable() Создает стандартный объект класса HashTable
public HashTable (IDictionary c) Инициализирует создаваемый объект элементами коллекции c
public HashTable (int capacity) Инициализирует емкость создаваемой хеш-таблицы значением capacity
public HashTable (int capacity, float fillRatio) Инициализирует емкость создаваемой хеш-таблицы (значением capacity) и коэффициент заполнения (значением fillRatio). Значение этого коэффициента (от 0,1 до 1,0) определяет степень заполнения хеш-таблицы, после чего ее размер увеличивается

 

В классе HashTable помимо методов, определенных в реализуемых им интерфейсах, определены собственные методы. Наиболее употребляемые из них перечислены в таблице:

 

Метод Описание
public virtual bool ContainsKey(object k) Возвращает true, если в вызывающей хеш-таблице содержится ключ k, иначе false
public virtual bool ContainsValue(object v) Возвращает true, если в вызывающей хеш-таблице содержится значение v, иначе false
public virtual IDictionaryEnumerator GetEnumerator() Возвращает для вызывающей хеш-таблицы нумератор типа IDictionaryEnumerator
public static HashTable Synchronized(HashTable ht) Возвращает синхронизированную версию хеш-таблицы ht

 

В классе HashTable, помимо свойств, определенных в реализуемых им интерфейсах, определены два собственных свойства. С их помощью можно из хеш-таблицы получить коллекцию ключей или значений:

public virtual ICollection Keys { get; }

public virtual ICollection Values { get; }

Важно отметить, что HashTable -коллекция не гарантирует сохранения порядка элементов, т.к. хеширование обычно не применяется к отсортированным таблицам.

 

Класс SortedList предназначен для создания коллекции, которая хранит пары ключ/значение в упорядоченном виде, а именно отсортированы по ключу. Этот класс реализует интерфейсы IDictionary, ICollection, IEnumerable и ICloneable.

В классе SortedList определено несколько конструкторов, включая следующие:

 

Прототип конструктора Описание
public SortedList() Создает пустую коллекцию емкостью 16 элементов
public SortedList (IDictionary c) Создает SortedList-коллекцию и инициализирует ее элементами коллекции c
public SortedList (int capacity) Создает пустую коллекцию емкостью capacity
public SortedList (IComparer comp) Создает пустую коллекцию емкостью 16 элементов и задает для них метод сравнения comp

 

В классе SortedList помимо методов, определенных в реализуемых им интерфейсах, также определены собственные методы. Наиболее часто употребляемые из них перечислены в таблице:

 

Метод Описание
public virtual bool ContainsKey(object k) Возвращает true, если в вызывающей SortList-коллекции содержится ключ k, иначе false
public virtual bool ContainsValue(object v) Возвращает true, если в вызывающей SortList-коллекции содержится значение v, иначе false
public virtual object GetByIndex(int idx) Возвращает значение, индекс которого равен idx
public virtual IDictionaryEnumerator GetEnumerator() Возвращает для вызывающей SortList-коллекции нумератор типа IDictionaryEnumerator
public virtual object GetKey(int idx) Возвращает ключ, индекс которого равен idx
public virtual IList GetKeyList() Возвращает IList-коллекцию ключей, хранимых в вызывающей SortList-коллекции
public virtual IList GetValueList() Возвращает IList-коллекцию значений, хранимых в вызывающей SortList-коллекции
public virtual int IndexOfKey(object k) Возвращает индекс ключа k или -1, если заданного ключа в списке нет
public virtual int IndexOfValue(object v) Возвращает индекс первого вхождения значения v или -1, если этого значения в списке нет
public virtual void SetByIndex(int idx, object v) Устанавливает значение по индексу idx равным значению v
public static SortedList Synchronized(SortedList sl) Возвращает синхронизированную версию SortList-коллекции sl
public virtual void TrimToSize() Устанавливает свойство Capacity равным значению свойства Count

 

В классе SortedList, помимо свойств, определенных в реализуемых им интерфейсах, определены два собственных свойства. Получить предназначенную только для чтения коллекцию ключей или значений, хранимых в SortedList -коллекции, можно с помощью свойств:

public virtual ICollection Keys { get; }

public virtual ICollection Values { get; }

 

Класс коллекции, предназначенный для поддержки стека, называется Stack. Он реализует интерфейсы ICollection, IEnumerable и ICloneable. Стек – это динамическая коллекция, которая при необходимости увеличивается, чтобы принять для хранения новые элементы, причем каждый раз, когда стек должен расшириться, его емкость удваивается.

В классе Stack определены следующие конструкторы:

 

Прототип конструктора Описание
public Stack() Создает пустой стек емкостью 10 элементов
public Stack(int capacity) Создает пустой стек с начальной емкостью capacity
public Stack (ICollection c) Создает стек, который инициализируется элементами коллекции c

 

Помимо методов, определенных в интерфейсах, которые реализует класс Stack, в нем определены собственные методы, перечисленные в таблице:

 

Метод Описание
public virtual bool Contains(object v) Возвращает true, если в вызывающем стеке содержится объект v, иначе false
public virtualvoid Clear() Очищает стек (устанавливает свойство Count равным нулю)
public virtual object Peek() Возвращает элемент, расположенный в вершине стека, но не удаляет его
public virtual object Pop() Возвращает элемент, расположенный в вершине стека, и удаляет его
public virtual void Push(object v) Помещает объект v в стек
public static Stack Synchronized(Stack stk) Возвращает синхронизированную версию стека stk
public virtual object[] ToArray() Возвращает массив, который содержит копии элементов вызывающего стека

 

Класс коллекции, предназначенный для поддержки очереди, называется Queue. Он реализует интерфейсы ICollection, IEnumerable и ICloneable. Очередь – это динамическая коллекция, которая при необходимости увеличивается, чтобы принять для хранения новые элементы, причем каждый раз, когда такая необходимость возникает, текущий размер очереди умножается на коэффициент роста, который по умолчания равен значению 2,0.

В классе Queue определены следующие конструкторы:

 

Конструктор Описание
public Queue() Создает пустую очередь с начальной емкостью в 32 элемента и коэффициентом роста 2,0
public Queue(int capacity) Создает пустую очередь с начальной емкостью capacity и коэффициентом роста 2,0
public Queue(int capacity, float growFact) Создает пустую очередь с начальной емкостью capacity и коэффициентом роста growFact
public Queue (ICollection c) Создает очередь, которая инициализируется элементами коллекции с

 

Помимо методов, определенных в интерфейсах, которые реализует класс Queue, в нем определены также собственные методы, перечисленные в таблице.

 

Метод Описание
public virtual bool Contains(object v) Возвращает true, если в вызывающей очереди содержится объект v, иначе false
public virtualvoid Clear() Очищает очередь (устанавливает свойство Count равным нулю)
public virtual object Dequeue() Возвращает объекта из начала вызывающей очереди, при этом объект из очереди удаляется
public virtual void Enqueue(object v) Добавляет объект v в конец очереди
public virtual object Peek() Возвращает элемент из начала вызывающей очереди, но не удаляет его
public static Queue Synchronized(Queue q) Возвращает синхронизированную версию очереди q
public virtual object[] ToArray() Возвращает массив, который содержит копии элементов вызывающей очереди
public virtual void TrimToSize() Устанавливает свойство Capacity равным значению свойства Count

 

Исключительная ситуация (или исключение) — это ошибка, которая возникает во время выполнения программы. Используя С#- подсистему обработки исключительных ситуаций, с такими ошибками можно справляться. Эта подсистема в С# включает в себя усовершенствованные методы, используемые в языках C++ и Java. Обработка исключений в С# отличается ясностью и полнотой реализации. Преимущество подсистемы обработки исключений состоит в автоматизации создания большей части кода, который ранее необходимо было вводить в программы "вручную". Например, в любом компьютерном языке при отсутствии такой подсистемы практически каждый метод возвращал коды ошибок, и эти значения проверялись вручную при каждом вызове метода. Такой подход довольно утомителен, кроме того, при этом возможно возникновение ошибок. Обработка исключений упрощает "работу над ошибками", позволяя в программах определять блок кода, именуемый обработчиком исключении, который будет автоматически выполняться при возникновении определенной ошибки. В этом случае не обязательно проверять результат выполнения каждой конкретной операции или метода вручную. Если ошибка возникнет, ее должным образом обработает обработчик исключений.

Еще одним преимуществом обработки исключительных ситуаций в С# является определение стандартных исключений для таких распространенных программных ошибок, как деление на нуль или попадание вне диапазона определения индекса. Чтобы отреагировать на возникновение таких ошибок, программа должна отслеживать и обрабатывать эти исключения.

 

7.1 Класс System.Exception

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

Изкласса Exception выведеныклассы SystemException и ApplicationException. Они поддерживают две общие категории исключений, определенные в С#: те, которые генерируются С# -системой динамического управления, или общеязыковым средством управления (CommonLanguageRuntimeCLR), и те, которые генерируются прикладными программами. Но ни класс SystemException, ни класс ApplicationException не привносят ничего нового в дополнение к членам класса Exception. Они просто определяют вершины двух различных иерархий классов исключений. С# определяет встроенные исключения, которые выводятся из класса SystemException. Например, при попытке выполнить деление на нуль генерируется исключение класса DivideByZeroException. Вы сможете создавать собственные классы исключений, выводя их из класса ApplicationException.

 

7.2 Основы обработки исключений

Управление С#-механизмом обработки исключений зиждется на четырех ключевых словах: try, catch, throw и finally. Они образуют всзимосвязанную подсистему, в которой использование одного из них предполагает использование другого.

Программные инструкции, которые нужно проконтролировать на предмет исключений, помещаются в try - блок. Если исключение возникает в этом блоке, онодает знать о себе выбросом определенного рода информации. Это выброшенное исключение может быть перехвачено программным путем с помощью catch - блока и обработано соответствующим образом. Системные исключения автоматически генерируютсяС#-системой динамического управления. Чтобы сгенерировать исключение вручную,используется ключевое слово throw. Любой код, который должен быть обязательновыполнен при выходе из try-блока, помещается в блок finally.

 

 

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

 

Ядром обработки исключений являются блоки try и catch. Эти ключевые слова работают "в одной связке"; нельзя использовать слово try без catch или catch без try. Вот каков формат записи try/catch-блоков обработки исключений:

try {

// Блок кода, подлежащий проверке на наличие ошибок.

}

catch {ExcepType1exOb) {

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

}

catch (ExcepType2 exOb) {

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

}…

Здесь ЕхсерТуре — это тип сгенерированного исключения.

После " выброса " исключение перехватывается соответствующей инструкцией catch, которая его обрабатывает. Из формата записи try/catch-блоков видно, с try-блоком может быть связана не одна, а несколько catch-инструкций. Какая именно из них будет выполнена, определит тип исключения. Другими словами, будет выполнена та catch-инструкция, тип исключения которой совпадает с типом сгенерированного исключения (а все остальные будут проигнорированы). После перехвата исключения параметр ехОb примет его значение.

Известно, что попытка индексировать массив за пределами его границ вызывает ошибку нарушения диапазона. В этом случае С#-система динамического управления генерирует исключение типа IndexOutOfRangeException, которое представляет собой стандартное исключение, определенное языком С#.

using System; // Демонстрация обработки исключений,

class ExcDemo1 {

public static void Main() {

int[] nums = new int [4];

try {

<== предыдущая лекция | следующая лекция ==>
Интерфейсы коллекций | Console.WriteLine(. Перед генерированием исключения.);
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 574; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.068 сек.