24
2013 Copyright © 2013 DAVID Holding Company Курс по програмиране на C# Занятие №13 Изключения. Анотации и отражение

Училищен курс по програмиране на C# (2013/2014), занятие №13

Embed Size (px)

DESCRIPTION

Училищен курс по програмиране на C# (2013/2014) Занятие №13: Обработка на грешки. Анотации и отражение

Citation preview

Page 1: Училищен курс по програмиране на C# (2013/2014), занятие №13

2013Copyright © 2013 DAVID Holding Company

Курс по програмиране на C#

Занятие №13Изключения. Анотации и отражение

Page 2: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Съдържание

• Изключения– Видове грешки– Връщане на код за състояние при извикване– Проверка на състоянието– Изключения

• Анотации и отражение– Програмни единици– Анотации– Отражение

Page 3: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Обработка на грешки

• Видове грешки– Compile time

• Грешки на компилатора по време на компилиране на приложението• В следствие на грешки на програмиста• Отстраняват се още по време на написване на приложението

– Run time• Грешки на CLR по време на изпълнение на приложението• В следствие на грешки на програмиста, непредвидени проблеми в

средата, входните данни, комуникацията и други изключителни ситуации

• Не се отстраняват, а се предвиждат

Page 4: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Обработка на грешки

// връщане на специален резултатDbStatus status = ExecuteDbQuery("…");switch (status){ case DbStatus.Ok: break; case DbStatus.NetworkError: // разбутай кабела break; case DbStatus.FileAccessError: // май имаме счупен диск? break; case DbStatus.FilePermissionError: // кофти права за достъп до файла? break;}

• Old school подходи към обработката на грешки– Връщане на код за състояние

при извикване– Прекалено много код при

всяко извикване– Нужда от допълнителни

параметри– Преправяне при нов код за

състояние– Вероятност за излишни,

недостатъчни проверки и/или повтарящ се код

Page 5: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Обработка на грешки

// проверка на състояниетоExecuteDbQuery("…");DbStatus status = GetDbStatus();switch (status){ case DbStatus.Ok: break; case DbStatus.NetworkError: // разбутай кабела break; case DbStatus.FileAccessError: // май имаме счупен диск? break; case DbStatus.FilePermissionError: // кофти права за достъп до файла? break;}

• Old school подходи към обработката на грешки– Проверка на състоянието– Прекалено много код след

всяко извикване– Нужда от допълнително

извикване– Вероятност за излишни,

недостатъчни проверки и/или повтарящ се код

– Нужда от познаване на тези състояния от външен код

Page 6: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Обработка на грешки

• Какво беше “call stack”?– Спомени от темата за рекурсия– Първо, какво беше “stack”?

• Колекция от елементи• Операция: добавяне на елемент в края (push)• Операция: взимане на елемент от края (pop)• LIFO (Last-In-First-Out структура)

– Та, какво е “call stack”?• Структура, която .NET Framework поддържа по време на изпълнение• Записва се информация за последното извикване на метод:

– Локалните променливи по време на извикването– Мястото на извикването– Параметрите, с които е направено

• С други думи: дава информация от къде идваме, за да се върнем обратно

Page 7: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Обработка на грешки

• Какво е „изключение“?– Изключение/изключителна ситуация– Проверка за възникване на изключение– Прихващане на изключения– Финализиране след проверка за изключение– Предизвикване на изключение

• Какво се случва при изключение?– Прекратява се изпълнението на текущия код– Намира се блок обработващ съответния тип изключения– Ако не съществува такъв блок, изпълнението приключва с

грешка– Финализиране, независимо дали е възникнала грешка или не

Page 8: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Обработка на грешки

• Изключения в C#– Информацията за изключения се пренася от обекти– Обектите са от вградения клас Exception или негов наследник

• Свойства Message, StackTrace и InnerException

– .NET Framework предлага множество вградени изключения• ArgumentException, IndexOutOfRangeException, IOException и др.

– Програмистът може да направи свой вид изключение• Конвенцията е наименованието на класа да завършва с Exception

Page 9: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Обработка на грешки

try{

// Операции при нормална работа// …// Предизвикване на изключениеthrow new DbException("DB error.");

}catch (ArgumentException ex){

// Обработване на ArgumentException}catch (Exception ex){

// Обработване на Exception}finally{

// Винаги изпълнявани операции}

• Изключения в C#– Конструкция try … catch …

finally• Блоковете catch и finally не за

задължителни, но поне единият трябва да присъства

• Възможно е наличието на повече от един catch блок

• В скобите на catch блок се указва типа на прихващаните изключения

– Предизвикване на изключение с throw• Възможно е предизвикване на

изключение в catch блока• Предизвикване на оригиналното

изключение

Page 10: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Обработка на грешки

// почистванеFileStream stream =File.OpenRead(@"C:\File.txt");try{

// работа с потока stream}finally{

stream.Dispose();}// съкратен запис на горнотоusing (FileStream stream =

File.OpenRead(@"C:\File.txt")){

// работа с потока stream}

• Конструкцията using– Интерфейсът IDisposable

• Декларира метод Dispose

– Съкратен запис и яснота на кода

Page 11: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Обработка на грешки

try{

// прекратява нишкатаThread.Abort();

}catch (ThreadAbortException){

// … някакъв код…// все едно тук пише:throw;// освен ако:// Thread.ResetAbort();

}

• Какво е „нишка“?– Отделна последователност от

инструкции независимо управлявани от ОС

– Многонишковост

• ThreadAbortException– Специално изключение

използвано при прекратяване на нишка

– Предизвиква се автоматично отново в края на catch блока

– … освен ако не се извика Thread.ResetAbort()

Page 12: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Обработка на грешки

// демонстрация

Page 13: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Анотации и отражение

• Програмни единици– Application domain – механизъм за

изолиране на изпълнението наразлични приложения

– Assembly – компилирана библиотекаот код (process & library assemblies)

– Module – съдържа код, метаданнии ресурси

– …

Page 14: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Анотации и отражение

• Какво е „анотация“?– Метод за асоцииране на метаданни или декларативна

информация с различни програмни единици– Анотациите се добавят от програмиста по време на разработка

на съответните програмни единици– Метаданните могат да съдържат информация за:

• Инструкции за работа на компилатора• Инструкции за работа при компилиране и изпълнение• Друга машинно обработваема информация

Page 15: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Анотации и отражение

• Анотации в .NET Framework– Анотациите са реализирани като обекти (т.нар. атрибути)– Обектите са от клас наследяващ класа Attribute

• Атрибутите могат да имат полета, свойства, методи и т.н.• Атрибутите могат да приемат аргументи• Към една програмна единица могат да се прилагат повече от един

атрибути

– .NET Framework предлага множество вградени атрибути• AssemblyNameAttribute, AssemblyVersionAttribute и др.• AssemblyCompanyAttribute, AssemblyCopyrightAttribute и др.• ObsoleteAttribute• SerializableAttribute и NonSerializedAttribute• AttributeUsageAttribute

Page 16: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Анотации и отражение

// демонстрация

Page 17: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Анотации и отражение

• Какво е „отражение“?– Техника за получаване на информация за програмни единици

по време на изпълнение, обръщение към тях и достъпването им– Отражението в частност може да се използва за обработка на

анотациите– Отражението може да се използва за сериализиране и

десериализиране на данни

Page 18: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Анотации и отражение

• Отражение в .NET Framework– Реализира се чрез използване на функционалността в

пространството на имена System.Reflection и класа System.Type

– System.Reflection.Emit дава възможност и за създаване на изпълним CIL (Common Intermediate Language) код от приложение (напр. написването на собствен компилатор)

– Може да се извлича разнообразна информация за различни компоненти (assemblies, модули, типове данни, методи, конструктори, полета, свойства, параметри, събития и др.)

Page 19: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Анотации и отражение

// демонстрация

Page 20: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Задачи за упражнение

• Модифицирайте задачата „Геометрични фигури“ от предходните упражнения, така че:– в началото на конструкторите и методите с параметри, да се

проверяват за коректност техните стойности и да се предизвикват съответните изключения

– при въвеждане на данни за даден обект, да се проверява тяхната коректност и да се предизвикват различни по вид изключения според ситуацията

– при изчисляване на параметрите за даден обект, да се проверява наличието на всички необходими данни и, ако липсват такива, да се предизвиква изключение

– в основната програма, да се прихванат различните изключения, да се изведе разбираемо съобщение и да се реагира адекватно на различните видове изключения

Page 21: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Задачи за упражнение

• Създайте C# библиотека, която да съдържа атрибута DeveloperInfoAttribute, който:– Съдържа информация за име, e-мейл адрес и телефон за

контакт на разработчика– Името и е-мейл адресът са задължителни, докато телефонният

номер не е– Атрибутът да може да се прилага повече от веднъж върху

всякакви програмни единици– Поставете така направения атрибут на всички възможни

програмни единици, като попълните информация за поне няколко разработчика

Page 22: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Задачи за упражнение

• Създайте аналитично приложение, което да:– изчита от клавиатурата наименованието на *.dll или *.exe файл– опитва да зареди файла като assembly– има добавена референция към проекта от предходното

упражнение– намира програмните единици, които имат атрибут

DeveloperInfoAttribute и извежда информацията от атрибута– има добавена референция към проекта „Геометрични фигури“– намира всички класове наследяващи класа Object2D, извежда

тяхното наименование и техните DeveloperInfoAttribute атрибути, ако имат такива (иначе надпис „No developer info for this class.”)

Page 23: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Въпроси?

Page 24: Училищен курс по програмиране на C# (2013/2014), занятие №13

Copyright © 2013 DAVID Holding Company

Благодаря!

• Валери Дачев– [email protected]– @vdachev– https://facebook.com/vdachev

• ДАВИД академия– [email protected]– http://acad.david.bg/– @david_academy– https://facebook.com/DavidAcademy