Винятки в С ++

Оціни цю статтю





виключення в с ++, виключення c ++, програмування для початківців

Иногда, під час роботи програм, зустрічаються ситуації які перешкоджають подальшої нормальної їх роботи. Наприклад при розподілі числа на нуль, програма завершить роботу не дивлячись на те, скільки користувач працював в програмі, і який обсяг даних вніс. Програма просто закриється. І уявіть, якщо до цього користувач вносив в програму дані кілька годин і проводив розрахунки. При такому аварійному закритті програми всі ці дані і розрахунки пропадуть. Согласитесь – не дуже приємно. Також може зустрітися така ситуація, коли програма намагається відкрити недоступний в цей момент файл, або запросити більше, ніж є пам'яті.

Такого роду ситуації програмістам треба намагатися передбачити і будувати програми так, щоб вони могли гнучко реагувати, а не аварійно закриватися. У моїй улюбленій книзі Язык программирования C . Лекции и упражнения автора З. Прата, дано таке визначення винятків в С ++:

виключення в с ++, виключення c ++, програмування для початківців

Щоб вам не складно було зрозуміти механізм роботи винятків в С ++, розглянемо їх на простому прикладі. У ньому ми передбачаємо той випадок, що в якийсь момент під час розрахунків програми, може зустрітися розподіл числа на 0. Наберіть і скомпілюйте код, розташований нижче. Щоб переконатися в тому, як реагує програма на таку ситуацію, внесіть число 0 в змінну num2 (вона виступає делителем в прикладі).

Так як змінна var дорівнює 3, цикл while, в нормальній ситуації, повинен відпрацювати три рази. З кожним кроком циклу var зменшується на одиницю за допомогою декремент. Але так як ми відразу внесли значення 0 в змінну num2, програма не пройде до кінця навіть перший крок циклу. вона перерветься.

У наступному лістингу, ми виправимо це упущення – додамо кілька компонентів, які допоможуть зреагувати на цю ситуацію без переривання роботи програми. А именно:

  • блок пробувати или пробувати-блок (спроба, зразок);
  • генератор виключення – блок кидати (обробити, запустити);
  • обробник виключення, який його перехоплює-команда виловити (зловити, ловити)

Як працює виняток? – Програміст прописує в коді (в пробувати-блоці) конкретна умова, що якщо змінна num2 МАТИМЕ 0, то в такому випадку необхідно генерувати виняток в кидати. Далі, то що згенерував кидати, перехоплює виловити-блок (у вигляді параметра функції) і програма виконає той код, який прописаний в цьому блоці.

Приклад:

зрозуміти в деталях. У рядках 21-29 знаходиться блок пробувати. У ньому необхідно розміщувати той код, який може призвести до незворотних помилок. Ще до арифметичного виразу розподілу задаємо умову: если num2 дорівнюватиме 0, то нехай кидати генерує число 999 (наприклад). В тому випадку, відразу після генерації числа, подальші команди в блоці пробувати виконуватися вже не будуть, а саме число “впаде” в блок виловити (у вигляді параметра). Далі виконається то, що зазначено в блоці виловити – в нашем случае, це буде повідомлення про помилку:

cout << "Помилка №" << Чет << " - поділ на 0!!!" << endl;

і програма буде виконувати наступні команди. В тому випадку, якщо число num2 != 0, то throw нічого не генерує і виловити-блок не спрацює.

подивіться тепер, як відреагує програма, якщо ви введете num2 рівне нулю. запускайте програму.

виключення в с ++, виключення c ++, програмування для початківців

як бачимо, там де могла статися помилка і дострокове завершення програми, ми побачили повідомлення Помилка №999 – поділ на 0!!! Программа “перескочила” через операцію ділення на 0 і виконала виловити-блок.

Щоб ви краще зрозуміли, як значення генерується кидати перехоплює виловити-блок, замініть код в рядках 21 – 33 на цей:

У цьому прикладі, если num2 равно 0, кидати генерує рядок, а не число. Строка “падає” в виловити-блок і виводиться на екран.

Розглянемо ще такий приклад, коли виняток генерується в функции, яка ділить одне число на інше:

Щоб виняток спрацювало правильно, цю функцію треба викликати в блоці пробувати:

виловити перехопить число 99, а розподіл на 0 не відбудуться.

Основное, що потрібно запам'ятати про винятки в С ++:

  • В пробувати-блоці (блоці повторних спроб) необхідно розміщувати код, який потенційно може привести до аварійного закриття програми;
  • Виняток генерується в блоці кидати. Если кидати спрацює програма почнеться автоматично команд виловити-блоку, ігноруючи решту код в пробувати-блоці;
  • вловлює блок – виловити-блок, перехоплює то, що генерує блок кидати. Він обов'язково повинен знаходитися під пробувати-блоком. Нічого не повинно бути прописано між ними;
  • виловити-блок не спрацює, якщо виключення не було згенеровано. Програма його просто проігнорує.

Щоб підтримати наш сайт – натисніть на скарбничку. Вам буде запропоновано відправити SMS. сума – на ваш вибір.

Нові уроки з програмування:

4 думки про "Винятки в С ++

  1. Взагалі то, тема винятків в будь-якій мові програмування – досить слизька. Такий механізм вносить як свої переваги, так і свої недоліки і приховані небезпеки використання.
    Мова C ++ – proizvodnиy, ніж C, і в цей розвиток включили виключення. наступне розвиток (2008-2009Г.Г.) мови C – це мова Go. З нього виключення були розробниками виключені і з дуже докладною опублікованій аргументацією чому вони це зробили.
    Реюме: виключення в C ++ потрібно використовувати, але тільки там, де вони вкрай необхідні, де без них не можна обійтися. В інших випадках краще використовувати традиційний повернення коду помилки.

  2. Допоможіть люди добрі!!! Що неправильно з try у мене?

    1. А у вас до throw справа не доходить – аварійне завершення настає раніше, при розподілі на 0.

      І параметром catch має бути щось, успадковане від класу винятків:

  3. Вітаю. У вас помилка в третьому лістингу.

    cout << num1 / num2 << endl; //потрібно вивести за межі оператора if. інакше не працює.

залишити коментар

Код розміщуйте в тегах: <pre class="lang:C ++ декодуванням:true ">ВАШ КОД</заздалегідь>