Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лабораторна робота № 11
Тема: Генерування виключної ситуації.
Мета: Навчитися обробляти виключні ситуації .Спроектувати и написати програму, яка використовує ці поняття.
Література: Г.Шилдт,Самоучитель С++, С.В. Глушков, Практикум по С++.
Теоретичні положення
Механізм обробки помилок (або виняткових ситуацій, виключень exception handling) вбудовано в мову C++. Цей механізм дозволяє коректно обробляти помилки, що виникають в процесі роботи програми. За його допомогою при виникненні помилки може бути автоматично викликана процедура її обробки. Принципова перевага такого підходу полягає в тому, що він дозволяє автоматично, в залежності від ситуації, запускати одну пз багатьох функцій обробки помилок, які попередньо «вручну» вбудовуються в основну програму. Належним чином запрограмована обробка виняткових ситуацій допомагає створювати дійсно відмовостійкі програми.
Обробка виняткових ситуацій в мові C++ організується за допомогою трьох ключових слів: try, catch та throw. Оператори програми, під час виконання яких потрібно забезпечити обробку виняткових ситуацій, розташовуються в блоці try. Якщо виняткова ситуація (тобто помилка) виникає всередині блоку try, вона «збуджується» (ключове слово throw), перехоплюється (ключове слово catch) та обробляється.
Функції, що викликаються в блоці try, також можуть збуджувати виняткову ситуацію. Будь-яка виняткова ситуація повинна перехоплюватися інструкцією catch, що розташовується безпосередньо за відповідним блоком try. Далі представлена основна форма інструкцій try та catch:
try {
// блок генерації виняткової ситуації
}
catch (type1 arg) {
// блок перехоплення виняткової ситуації
}
catch (type2 arg) {
// блок перехоплення виняткової ситуації
}
…
catch (type arg) {
// блок перехоплення виняткової ситуації
}
У блоках try повинні бути розташовані ті частини програми, при виконанні яких необхідно відслідковувати можливі помилки. Це можуть бути як кілька інструкцій всередині однієї функції, так і всі інструкції функції main(). Після генерації виняткової ситуації вона перехоплюється та обробляється у відповідному блоці-оброблювачі catch. З блоком try може бути звязано декілька інструкцій catch. Tе, яка саме інструкція catch буде використана, залежить від типу виняткової ситуації. Іншими словами, якщо тип даних, зазначений в інструкції catch, відповідає типу (значенню) згенерованої виняткової ситуації, виконується дана інструкція catch. При цьому решта інструкцій блоку try буде проігноровано (тобто відразу після того, як якась інструкція в блоці try зумовила появу виняткової ситуації, керування передається відповідній інструкції catch, минаючи решту інструкцій блоку try). Якщо виняткова ситуація перехоплена, аргумент arg буде містити відповідне значення. Якщо доступ до значення виняткової ситуації не потрібен, в інструкції catch можна вказати лише її тип type, а аргумент arg вказувати не обовязково. Можна перехоплювати значення будь-яких типів даних, у тому числі структур та класів.
Ось основна форма інструкції throw.
throw <значення, що ідентифікує виключення>;
Інструкція throw повинна виконуватися або усередині блоку try, або в будь-якій функції, що викликається у цьому блоці.
У наступному прикладі показано, як в мові C++ функціонує система обробки виняткових ситуацій.
#include <iostream>
#include<conio.h>
using namespace std;
int main()
{
int a;
char* b = "test string for exception generation";
cout << "Begining..." << endl;
//cout << b;
try {
// Блок try
cin >> a;
cout << "Inside try block" << endl;
if(!a) throw 10; // Генерація виключення 10
if(a == -1) throw 10.; // Генерація виключення 10.
else throw b; // Генерація виключення зі строковим ідентифікатором
cout << "This statement can't to be executed";
}
catch (int i)
{ // Оброблювач 1
cout << "Error with number: ";
cout << i << endl;
}
catch (char* b)
{ // Оброблювач 2
cout << "String error: ";
cout << b << endl;
}
catch(...)
{ // Узагальнений оброблювач
cout << "Unknown error 10.!" << endl;
cout << "Program finished ...";
}
getch();
return 0;
}
Хід роботи
Реалізувати варіанти завдань з лабораторній роботи № 1 з урахуванням наступних додаткових вимог.
за допомогою вкладених блоків try;
шляхом перехвату виключень у основній програмі та у функції, що викликається.
Контрольні запитання