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

exceptions-СPP.ppt

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Розгортання стеку End func A(){ a 1, a 2, a 3; Start а 3 Розгортання стеку End func A(){ a 1, a 2, a 3; Start а 3 а 2 а 1 func B(){ } } b 1, b 2; End Start b 2 b 1 а 3 а 2 а 1 16

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

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