- •Int main() /* головна обов’язкова функція, де ключове слово int означає, що функція main() повертатиме у точку виклику результат цілого типу*/ 6
- •Засоби розробки с програм
- •Директиви препроцесора.
- •Using namespace std; // вказуємо, що будемо працювати з іменами із стандартної бібліотеки
- •Запитання
- •Тема 2. Данні
- •Команда присвоєння. Правила узгодження типів.
- •Запитання
- •Тема 3. Операції та вирази
- •Тема 4. Потоки. Введення - виведення даних
- •Форматування даних
- •Введення-виведенні засобами бібліотеки сstdіo
- •Тема 5. Адреси даних. Вказівники. Динамічна пам’ять
- •Тема 6. Файли
- •Тема 7. Розгалуження
- •Логічні вирази та логічні операції.
- •Команда ?
- •Тема 8. Цикли
- •Команда циклу з післяумовою do-while має вигляд
- •Тема 9. Функції (1)
- •Тема 10. Функції (2)
- •Тема 11. Масиви
- •Тема 12. Рядки
- •Тема 13. Структури, списки, стеки, черги, об’єднання
- •Тема 14. Виняткові ситуації
- •Http://www.Rate1.Com.Ua/strannosti/2633/ Самі фатальні помилки в програмному забезпеченні
- •Помилки під час виконання (виняткові ситуації, виключення) Exceptions - це помилки, що виникають у випадку, коли програма намагається виконати неприпустиму операцію.
- •Тема 15. Графіка
- •Написание простых графических программ
- •Http://www.Rsdn.Ru/article/opengl/ogltut2.Xml Графическая библиотека OpenGl
Тема 14. Виняткові ситуації
1. Види помилок при програмуванні. Навіть самі досвідчені програмісти роблять помилки, тому знання способів налагодження додатків і пошуку цих помилок, обробка помилкових ситуацій є важливою частиною програмування.
Помилки програмування діляться на три категорії:
помилки компіляції,
помилки під час виконання
і логічні помилки.
Http://www.Rate1.Com.Ua/strannosti/2633/ Самі фатальні помилки в програмному забезпеченні
Помилки компіляції, також називані помилками компілятора, перешкоджають запуску програми. При натисканні клавіші F5 для запуску програми компілюється код у двійкову мову, що зрозумілий комп'ютеру. Якщо компілятор одержує код, якій він не розуміє, видається помилку компілятора.
Більшість помилок компілятора викликані помилками при введенні коду. Наприклад, може бути неправильно написане ключове слово, пропущені деякі необхідні розділові знаки й т.д.
У редакторі коду передбачена ідентифікація цих помилок перед спробою запуску програми.
Логічні помилки не дозволяють програмі правильно виконувати передбачувані дії. Код може компілюватися й виконуватися без помилок, але результат операції може виявитися несподіваним і невірним.
Помилки під час виконання (виняткові ситуації, виключення) Exceptions - це помилки, що виникають у випадку, коли програма намагається виконати неприпустиму операцію.
Прикладами таких неприпустимих операцій є
ділення на нуль,
спроба присвоїти значення поза припустимим діапазоном,
спроба звернутися до неіснуючого елемента масиву,
вихід за границі масиву,
помилка при спробі зчитати дані із зовнішнього пристрою
спроба запису даних на носій, захищений від запису,
вичерпання доступної пам'яті,
відключення електроживлення системи,
відсутність з'єднання з мережею,
поява на вході комунікаційного каналу даних, що вимагають негайного зчитування,
звертання по порожньому посиланню,
неправильний стан монітора,
відсутність паперу в принтері й т.п.
2. Види виключень. Виняткові ситуації, що виникають при роботі програми, можна розділити на два основних типи: синхронні й асинхронні, принципи реакції на які істотно різняться.
Синхронні виключення можуть виникнути тільки в певних, заздалегідь відомих точках програми. Так, помилка читання файлу або комунікаційного каналу, нестача пам'яті — типові синхронні виключення, тому що виникають вони тільки в операції читання з файлу або з каналу або в операції виділення пам'яті відповідно.
Асинхронні виключення можуть виникати в будь-який момент часу й не залежать від того, яку конкретно інструкцію програми виконує система. Типові приклади таких виключень: аварійна відмова живлення або надходження нових даних.
Деякі типи виключень можуть бути віднесені як до синхронних, так і до асинхронного.
3. Механізм обробки виняткових ситуацій. Якщо у прикладної програми механізм обробки виключень відсутній, найчастіше реакцією на будь-яку виняткову ситуацію є негайне припинення виконання з видачею користувачеві повідомлення про характер виключення. Тобто єдиним і універсальним оброблювачем виключень стає операційна система. Наприклад, в операційну систему Windows убудовано утиліту Dr. Watson, яка займається збором інформації про неопрацьоване виключення і її відправлення на спеціальний сервер компанії Microsoft.
Можливе ігнорування виняткової ситуації й продовження роботи, але така тактика небезпечна, тому що приводить до помилкових результатів роботи програм або виникненню помилок згодом. Наприклад, проігнорувавши помилку читання з файлу блоку даних, програма одержить у своє розпорядження не ті дані, які вона повинна була зчитати, а якісь інші. Результати їхнього використання передбачити неможливо.
Обробка виняткових ситуацій самою програмою полягає в тім, що при виникненні виняткової ситуації керування передається деякому заздалегідь певному оброблювачу — блоку коду, процедурі, функції, які виконують необхідні дії.
Існує два принципово різних механізми обробки виключень.
Обробка з поверненням - оброблювач виключення ліквідує проблему, що виникла й приводить програму в стан, коли вона може працювати далі по основному алгоритму. У цьому випадку після того, як виконається код оброблювача, керування передається назад в ту точку програми, де виникло виключення й виконання програми продовжується. Обробка з поверненням типове для оброблювачів асинхронних виключень (які звичайно виникають із причин, не зв'язаним прямо з виконуваним кодом), для обробки синхронних виключень вона малопридатна.
Обробка без вороття полягає в тому, що після виконання коду оброблювача виключення керування передається в деяке, заздалегідь задане місце програми, і з цієї точки продовжується виконання. Тобто, фактично, при виникненні виключення команда, під час роботи якої воно виникло, заміняється на безумовний перехід до заданого оператора.
4. Обробка виняткових ситуацій. Існує два варіанти підключення оброблювача виняткових ситуацій до програми: структурна й неструктурна обробка виключень.
Неструктурна обробка виключень реалізується у вигляді механізму реєстрації функцій або команд-оброблювачів для кожного можливого типу виключення. Мова програмування або його системні бібліотеки надають програмісту стандартні процедури.
Неструктурна обробка — практично єдиний варіант для обробки асинхронних виключень, але для синхронних виключень вона незручна
Структурна обробка виключень вимагає обов'язкової підтримки з боку мови програмування - наявності спеціальних синтаксичних конструкцій
Обробка виняткових ситуацій у мові С++ є об’єктно-орієнтованою. Це значить, що виняткова ситуація є об'єктом, що генерується при виникненні незвичайних умов, передбачених програмістом, і передається оброблювачу, що її перехоплює.
В основі обробки виключень у мові С++ лежать три ключових слова: try, catch і throw (спробувати, зловити и кидок).
Якщо програміст підозрює, що визначений фрагмент програми може спровокувати помилку, він повинний заключити цю частину коду в блок try. Необхідно мати на увазі, що зміст помилки (за винятком стандартних ситуацій) визначає сам програміст. Це значить, що програміст може задати будь-яку умову, що приведе до створення виняткової ситуації. Після цього необхідно вказати, у яких умовах варто генерувати виняткову ситуацію. Для цієї мети призначене ключове слово throw. І нарешті, виняткову ситуацію потрібно перехопити й обробити в блоці catch. Ось як виглядає ця конструкція.
try {
// Тіло блоку try
if ( умова ) throw виняткова_ситуація
}
catch (тип1 аргумент) {
// Тіло блоку catch
}
catch (тип2 аргумент) {
// Тіло блоку catch
}
. . .
catch(типN аргумент) {
// Тіло блоку catch
}
Розмір блоку try не обмежений. У нього можна заключити як один оператор, так і цілу програму. Один блок try можна зв'язати з довільною кількістю блоків catch. Оскільки кожен блок catch відповідає окремому типу виняткової ситуації, програма сама визначить, який з них виконати. У цьому випадку інші блоки catch не виконуються. Кожен блок catch має аргумент, що приймає визначене значення. Цей аргумент може бути об'єктом будь-якого типу. Якщо програма виконана правильно й у блоці try не виникло жодної виняткової ситуації, усі блоки catch будуть зігноровані. Якщо в програмі виникла подія, що програміст вважає небажаним, оператор throw генерує виняткову ситуацію. Для цього оператор throw повинний знаходитися усередині блоку try або усередині функції, викликуваної усередині блоку try.
Якщо в програмі виникла виняткова ситуація, для якої не передбачені перехоплення й обробка, викликається стандартна функція terminate(), що, у свою чергу, викликає функцію abort(). Утім, іноді виняткова ситуація не є небезпечною. У цьому випадку можна виправити помилку (наприклад, присвоїти нульовому знаменнику ненульове значення) і продовжити виконання програми.
Приклад. Обробка виняткової ситуації
#include <iostream>
using namespace std;
int main() {
int n = 10, m = 0;
printf("Початок\n");
try {
printf("У блоці try\n");
if(m==0) throw "Divide by zero";
else n=n/m;
printf("Подальша частина блоку не виконується!");
}
catch (const char* s) {
printf("%s\n",s);
}
printf("Кінець\n");
return 0;
}
Ця програма виводить на екран наступні рядки.
Початок
У блоці try
Divide by zero
Кінець
Простежимо за потоком керування при виконанні цієї програми.
Спочатку з'являються і ініціалізуються дві целочисельні перемінні (одна з них дорівнює нулю). Потім виводиться повідомлення про початок виконання програми, і потік керування входить у блок try. Після виводу рядка повідомлення про вхід у блок try, потік керування переходить до перевірки рівності m==0. Оскільки ця рівність є істиною, генерується виняткова ситуація (у даному випадку — константний рядок). Керування негайно передається блоку catch, аргументом якого є константний символьний вказівник, ігноруючи всі інші оператори в блоці try. У цій програмі блок catch не робить жодних спроб виправити помилку. Замість цього він просто видає повідомлення — рядок, отриманий як аргумент — і передає керування оператору, що слідує за блоком. На закінчення функція printf() виводить на екран рядок Кінець, і програма завершує свою роботу. Тип виняткової ситуації повинний збігатися з типом аргументу розділу catch.
