Обробка винятків

Лабораторна робота № 4

Тема: Розробка програм із комплексним використанням основних концепцій об’єктно-орієнтованного програмування і можливостей С++.
Мета: Придбати практичні навички застосування основних концепцій і можливостей мови програмування С++ в комплексі, в одному проекті; практично опанувати технологією обробки виключень, RTTI, принципами файлового вводу-виводу, та іншими.
Обладнання: IBM-сумісний ПK.
Програмне забезпечення: OC Windows, інтегроване середовище розробки програм на мові С++.
Завдання: Скласти програму «Електронна записна книжка». Об’єкти обліку: контакти, свята, зустрічі та інші. Функції програми: додавання об’єктів, видалення, редагування, відображення, пошук, збереження у файлі, відкриття із файлу; Програмна реалізація: створити і використати ієрархію класів для об’єктів обліку. Додаткові вимоги: для обробки помилок використовувати технологію обробки виключень, для ідентифікації типів – технологію RTTI, для збереження у файли – двійкові файлові потоки, для приведення типів – відповідні оператори, для реалізації меню користувача – вказівники на функції, а також оператор typedef, простір імен і інші можливості там де це потрібно.  
Зміст звіту: 1. Порядок виконання роботы. 2. Вихідні коди програми з коментарями. 3. Результати тестування програми Висновки  

Короткі теоретичні відомості

RTTI

У суворо тіпізованних мовах компілятор здійснює весь контроль типів, так що немає особливої необхідності зберігати інформацію про класи і типи в працюючій програмі. Тим не менш, є випадки (як, наприклад, динамічне перетворення типів), які вимагають інформацію про тип. З цієї причини всі три ГО мови, що розглядаються тут, більш-менш підтримують Ідентифікацію / Інформацію про тип Часу Виконання (RTTI).

C++: спочатку не підтримував RTTI. Це було додано пізніше для динамічного перетворення типу (dynamic_cast) і зробило доступною деяку інформацію про тип для класів. Ви можете запитати ідентифікацію типу для об'єкта, і перевірити, чи належать два об'єкти одного класу.

OP: підтримує і вимагає багато RTTI. Доступний не тільки контроль відповідності та динамічне перетворення типів (за допомогою операторів is і as). Класи генерують розширену RTTI для своїх published властивостей, методів і полів. Фактично це ключове слово управляє частиною генерації RTTI. Вся ідея властивостей, механізм потоків (файли форм - DFM), і середовище Delphi, починаючи з Інспектора Об'єктів, сильно спирається на RTTI класів. У класу TObject є (крім інших) методи ClassName і ClassType. ClassType повертає змінну типу класу, об'єкт спеціального типу посилання на клас (який не є самим класом).

Java: як і в Object Pascal, в Java теж є єдиний базовий клас, який допомагає стежити за інформацією про клас. Безпечне перетворення типів (type-safe downcast) вбудовано в цю мову. Метод getClass () повертає свого роду метакласс (об'єкт класу, що описує класи), і Ви можете застосувати функцію getName () для того, щоб отримати рядок з ім'ям класу. Ви можете також використовувати оператор instanceof. Java включає в себе розширену RTTI для класів або інтроспекції, яка була введена для підтримки компонентної моделі JavaBeans. У Java існує можливість створювати класи під час виконання програми.

Обробка винятків

Основна ідея обробки виключень - спростити код обробки помилок у програмі, надавши стандартний вбудований механізм, з метою зробити програми більш стійкими. Обробка винятків - це тема, яка потребує окремого розгляду, тому я тільки Окреслено деякі ключові елементи і відмінності.

C + +: C + + використовує ключове слово throw для генерації виключення, try для позначки охороняється блоку і catch для запису коду обробки виключення. Виключення - об'єкти спеціального класу, які можуть утворювати деяку ієрархію у всіх трьох мовах. При виникненні виключення C + + виконує очищення стека до точки перехоплення виключення. Перед видаленням кожного об'єкта в стеці викликається відповідний деструктор.

OP: Object Pascal використовує подібні ключові слова: raise, try, і except і володіє подібними властивостями. Єдина істотна відмінність полягає в тому, що спустошення стека не проводиться, просто тому, що в стеці немає об'єктів. Крім того, ви можете додати в кінці блоку try слово finally, відзначаючи блок, який повинен виконуватися завжди, незалежно від того, було чи ні викликано виняток. В Delphi класи виключень - похідні Exception.

Java: Використовує ключові слова C + +, але веде себе як Object Pascal, включаючи додаткову ключове слово finally. (Це загальна властивість всіх мов з посилальної-об'єктною моделлю, вона була придбана Borland також і в C + + Builder 3.) Присутність алгоритму складання сміття обмежує використання finally в класі, який розподіляє інші ресурси, окрім пам'яті. Також Java суворіше вимагає, щоб всі функції, які можуть викликати виключення, описували у відповідному блоці, які виключення можуть бути викликані функцією. Ці описи винятків перевіряються компілятором, що є гарним властивістю, навіть якщо воно має на увазі деяку додаткову роботу для програміста. У класах Java об'єкти-винятку повинні наслідувати класу Throwable.

В цілому, обробка винятків може виглядати таким чином (у деякій абстрактній мові):

Наши рекомендации