Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Vse_shpory_po_OOP_polnye.doc
Скачиваний:
6
Добавлен:
20.09.2019
Размер:
295.94 Кб
Скачать

11. Исключения. Создание класса пользовательского исключения. Генерация и перехват исключения.

Исключение – объект специального вида. Все они наследуются от базового класса Exception. Пример исключений: ArgumentNullExeption (если ссылка на аргумент null, то выбрасывается исключение). Исключение создается с помощью оператора new. Оператор для генерации (выброса) исключений: throw <объект исключения>. Пример:

If(p == null)

{throw new ArgumentNullException(“Переменная р не может быть null”);}

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

try {…//операции, которые могут выбросить исключение}

catch(<Класс исключения>[переменная])

{…//операции, которые выполняются при выбросе данного исключения}

К одной конструкции try можно прикрепить несколько блоков catch. Блоки catch проверяются на исключения по очереди. После catch переходим к следующему блоку после оператора. Обработка исключений: 1) заглушка исключения или вывод сообщения о нем; 2) возврат к точке исключения. Управлять кодом выполнения программы с помощью исключений неэффективно и бесперспективно, т.к. возрастают вычислительные потери на обработку исключений. В современном варианте выбрасывать исключения имеет смысл только тогда, когда программа точно не может продолжать выполнение в заданной ситуации. Еще один блок, который можно добавить к конструкции try-catch (или после всех catch, или после try, если catch нет) – finally. Он всегда находится в конце и его можно добавить только 1 раз. Операторы в блоке finally выполняются всегда. При написании нескольких блоков catch желательно останавливаться на исключении Exception(базовом классе исключений). Крайне нежелательно чтобы исключения появлялись в финализаторах класса. При возникновении исключения в статическом конструкторе CLR(среда выполнения) обрабатывает его специальным образом. Исходное исключение подавляется и вместо него генерируется исключение вида TypeInitializationException. При этом у нового вида TypeInitializationException свойство InnerException устанавливается в исходное исключение. Наиболее важные свойства класса Exception: 1) InnerException – вложенное исключение, имеет значение не null тогда, когда данное исключение сгенерировано на основе другого исключения. Это позволяет проследить цепочку исключений. 2) Message – текстовое сообщение об ошибке. 3) Source – исходный объект, который прогенерировал исключение.

12. Рефлексия типов. Класс типа Type. Методы и свойства класса.

Рефлексия - свойство объекта узнавать информацию о самом себе. В подавляющем большинстве языков программирования типы данных не в состоянии узнать информацию о самих себе во время выполнения. Рефлексия – это и есть механизм, который позволяет это делать. В С# с помощью рефлексии тип данных может узнать следующую информацию: 1) список общедоступных конструкторов; 2) список общедоступных методов, свойств, полей и их типы; 3)список общедоступных событий; 4) список интерфейсов, которые реализует класс; 5) список пользовательских атрибутов; 6) параметры подстановки в обобщенном классе и их ограничения.

Во время выполнения можно получить тип метода и вызвать его на объекте. Возможности рефлексии сосредоточены в двух пространствах имен: System.Reflection, System.Reflection.Emit.

Основной класс, отвечающий за возможности рефлексии, называется Type.

Объект этого же класса возвращается методом Object.GetType().У этого метода есть статический аналог, который вызывается не на методе, а на классе typeof(имя класса).

Например, если нужно узнать, что 2 объекта имеют одинаковый тип, то можно написать так: Object.ReferenceEquals(x.GetType(), y.GetType()) - этот метод вернет true, если у объектов совпадают типы.

Классу Type сопутствует набор вспомогательных классов, которые предназначены для хранения данных о конкретном члене класса (поле, методе, событии и др.). Все эти классы называются следующим образом: FieldInfo, PropertyInfo, MethodInfo, EventInfo, AttributeInfo, ConstructorInfo. С помощью объектов таких классов можно узнать информацию о члене класса.

Средства рефлексии позволяют также работать со сборками (с библиотеками). Класс для работы со сборками называется Assembly. Его методы позволяют узнать, какие элементы содержаться в сборке.

Пример: Имеется некоторый класс. В нем необходимо перекрыть метод ToString таким образом, чтобы он выводил список общедоступных свойств.

public class MyClass

{

public string FirstProperty {get;set}

public int SecondProperty {get;set}

}

PropertyInfo[]p = this.GetType().GetProperties(); //получаем массив свойств объекта

StringBuilder sb = new StringBuilder();

foreach (var pi in p)

{sb += pi.Name + ”=”; //возвращается имя свойства

sb += pi.GetValue(this , null).ToString();}

Метод GetValue возвращает значение object (в нашем случае, значение свойства).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]