1 Проф. Куссуль Н. М. Виключення 2 Механізм

Скачать презентацию 1 Проф. Куссуль Н. М. Виключення 2 Механізм Скачать презентацию 1 Проф. Куссуль Н. М. Виключення 2 Механізм

exceptions-spp.ppt

  • Количество слайдов: 18

>1 Проф. Куссуль Н.М. Виключення 1 Проф. Куссуль Н.М. Виключення

>2 Механізм виключень Механізм обробки помилок (або виняткових ситуацій, виключень — exception handling) вбудовано 2 Механізм виключень Механізм обробки помилок (або виняткових ситуацій, виключень — exception handling) вбудовано в мову C++. Дозволяє коректно обробляти помилки, що виникають в процесі роботи програми. За його допомогою при виникненні помилки може бути автоматично викликана процедура її обробки.

>3 Механізм виключень Принципова перевага такого підходу полягає в тому, що він дозволяє автоматично, 3 Механізм виключень Принципова перевага такого підходу полягає в тому, що він дозволяє автоматично, в залежності від ситуації, запускати одну з багатьох функцій обробки помилок, які попередньо «вручну» вбудовуються в основну програму. Належним чином запрограмована обробка виняткових ситуацій допомагає створювати дійсно відмовостійкі програми.

>4 Try-catch-throw Обробка виняткових ситуацій в мові C++ організується за допомогою трьох ключових слів: 4 Try-catch-throw Обробка виняткових ситуацій в мові C++ організується за допомогою трьох ключових слів: try catch та throw. Оператори програми, під час виконання яких потрібно забезпечити обробку виняткових ситуацій, розташовуються в блоці try.

>5 Try-catch-throw Якщо виняткова ситуація (тобто помилка) виникає всередині блоку try, вона «збуджується» (ключове 5 Try-catch-throw Якщо виняткова ситуація (тобто помилка) виникає всередині блоку try, вона «збуджується» (ключове слово throw), перехоплюється (ключове слово catch) та обробляється. Функції, що викликаються в блоці try, також можуть збуджувати виняткову ситуацію. Будь-яка виняткова ситуація повинна перехоплюватися інструкцією catch, що розташовується безпосередньо за відповідним блоком try.

>6 Try-catch-throw try { // блок генерації виняткової ситуації } catch (type1 arg) { 6 Try-catch-throw try { // блок генерації виняткової ситуації } catch (type1 arg) { // блок перехоплення виняткової ситуації } catch (type2 arg) { // блок перехоплення виняткової ситуації }

>7 Throw throw <значення, що ідентифікує виключення>; Інструкція throw повинна виконуватися або усередині блоку 7 Throw throw <значення, що ідентифікує виключення>; Інструкція throw повинна виконуватися або усередині блоку try, або в будь-якій функції, що викликається у цьому блоці.

>8 Завершення програми При генерації виняткової ситуації, для якої немає відповідної інструкції catch, може 8 Завершення програми При генерації виняткової ситуації, для якої немає відповідної інструкції catch, може відбутися аварійне завершення програми. Якщо компілятор відповідає стандарту C++, то генерація необроблюваної виняткової ситуації приведе до виклику стандартних бібліотечних функцій unexpected() та terminate(). За замовчуванням для завершення програми функція terminate() викликає функцію abort(), однак при необхідності можна задати власну процедуру завершення програми.

>9 Приклад void func() { try {throw 1;} catch(int a) { cout << 9 Приклад void func() { try {throw 1;} catch(int a) { cout << "Caught excep numb: " << a << endl; return; } cout << "No exception detected!" << endl; return; } Caught exception number: 1 void func() { try {//throw 1;} catch(int a) { cout << "Caught excep numb: " << a << endl; return; } cout << "No exception detected!" << endl; return; } No exception detected!

>10 throw MyClass(); catch (MyClass &d) {}; catch Ловить дані будь-якого типу, змінну вказувати 10 throw MyClass(); catch (MyClass &d) {}; catch Ловить дані будь-якого типу, змінну вказувати не обов'язково catch(dumbclass) { } //коректно catch(dumbclass&) { } //коректно catch(...) { } //”зловити” всі виключення

>11 Створення виключення double mean(double a, double b) throw(char *); double multipleErrorsFunction(double z) throw(char 11 Створення виключення double mean(double a, double b) throw(char *); double multipleErrorsFunction(double z) throw(char *, double); double simple(double z) throw (); // не генерує виключень catch (char* s) { cout << "Exception caught in inner loop.“ <<; throw; //перенаправлення до зовнішнього блоку try }

>12 Приклад int main() { int a; char* b = 12 Приклад 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"; }

>13 Приклад catch (int i) { // Оброблювач 1 cout << 13 Приклад 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; }

>14 try { throw; // ни один оператор, следующий далее (до //закрывающей скобки) // 14 try { throw; // ни один оператор, следующий далее (до //закрывающей скобки) // выполнен не будет } catch(...) { cout << "Исключение!" << endl; }

>15 Приклад 2 15 Приклад 2

>16 Розгортання стеку а1 а3 а2 а1 а3 а2 b1 b2 Start End Start 16 Розгортання стеку а1 а3 а2 а1 а3 а2 b1 b2 Start End Start End func A(){ a1, a2, a3; func B(){ b1, b2; } }

>17 Стандартні виключення 17 Стандартні виключення

>18 Макрос assert Макрос assert (assert.h) дозволяє виконувати у програмі перевірку тверджень (assertion). Даний 18 Макрос assert Макрос assert (assert.h) дозволяє виконувати у програмі перевірку тверджень (assertion). Даний макрос корисний для швидкого включення діагностики в програми. Якщо значення виразу expression assert (expression) при його виконанні є false (0), то до стандартного потоку буде виведено повідомлення: Assertion failed: expression, file xyz, line nnn а програма буде завершена аварійно. У повідомленні про помилку xyz — це ім’я файлу з кодом програми, nnn — номер рядка у цьому файлі, що містить оператор assert.