C++ Обробка винятків: Try, Catch, throw Приклад
У чому полягає обробка винятків C++?
Обробка винятків у C++ надає вам спосіб обробки несподіваних обставин, таких як помилки виконання. Тому щоразу, коли трапляються несподівані обставини, керування програмою передається до спеціальних функцій, відомих як обробники.
Щоб перехопити винятки, ви розміщуєте певний розділ коду під перевіркою винятків. Розділ коду розміщено в блоці try-catch.
Якщо в цьому розділі коду виникає надзвичайна ситуація, буде створено виняток. Далі обробник винятків візьме на себе контроль над програмою.
Якщо не станеться виняткових обставин, код виконуватиметься нормально. Обробники будуть проігноровані.
В цьому C++ навчальний посібник, ви дізнаєтеся:
Чому обробка винятків?
Ось причина використання обробки винятків C++:
- Ви відокремите код обробки помилок від звичайного коду. Код стане більш читабельним і його буде легше підтримувати.
- Функції можуть обробляти винятки, які вони вибирають. Навіть якщо функція генерує багато винятків, вона оброблятиме лише деякі. Абонент оброблятиме неперехоплені винятки.
Ключові слова обробки винятків
Обробка винятків у C++ обертається навколо цих трьох ключових слів:
- кидати– коли програма стикається з проблемою, вона створює виняток. Ключове слово throw допомагає програмі виконати кидок.
- зловити– програма використовує обробник винятків для перехоплення винятків. Він додається до розділу програми, де потрібно вирішити проблему. Це робиться за допомогою ключового слова catch.
- намагатися– блок try визначає блок коду, для якого будуть активовані певні винятки. За ним має слідувати один/кілька блоків catch.
Припустимо, блок коду викличе виняток. Виняток буде перехоплено методом із використанням ключових слів try and catch. Блок try/catch має оточувати код, який може викликати виключення. Такий код відомий як захищений код.
синтаксис
Try/catch використовує такий синтаксис:
try { // the protected code } catch( Exception_Name exception1 ) { // catch block } catch( Exception_Name exception2 ) { // catch block } catch( Exception_Name exceptionN ) { // catch block }
- Хоча у нас є один оператор try, ми можемо мати багато операторів catch.
- ExceptionName — це ім’я винятку, який буде перехоплено.
- Виняток1, виняток2 та винятокN — це визначені вами імена для посилань на винятки.
Приклад 1:
#include<iostream> #include<vector> using namespace std; int main() { vector<int> vec; vec.push_back(0); vec.push_back(1); // access the third element, which doesn't exist try { vec.at(2); } catch (exception& ex) { cout << "Exception occurred!" << endl; } return 0; }
вихід:
Ось скріншот коду:
Пояснення коду:
- Включіть файл заголовка iostream у програму, щоб використовувати його Функції.
- Включіть векторний файл заголовка в програму, щоб використовувати її функції.
- Включіть простір імен std у програму до її класів, не викликаючи її.
- Виклик функції main(). Логіку програми слід додати в її тіло.
- Створіть вектор з іменем vec для зберігання цілочисельних даних.
- Додайте елемент 0 до вектора з іменем vec.
- Додайте елемент 1 до вектора з іменем vec.
- коментар. Це буде пропущено C++ компілятор.
- Використовуйте оператор try, щоб перехопити виняток. { позначає початок тіла блоку try/catch. Код, доданий у тіло, стане захищеним кодом.
- Спробуйте отримати доступ до елемента, який зберігається під індексом 2 (третій елемент) вектора з іменем vec. Цей елемент не існує.
- Кінець тіла блоку try/catch.
- Спіймати виняток. Повернене повідомлення про помилку буде збережено в змінній ex.
- Роздрукуйте повідомлення на консолі, якщо виявлено виняток.
- Кінець корпусу фіксатора.
- Програма має повернути значення після успішного виконання.
- Кінець тіла функції main().
Приклад 2:
#include <iostream> using namespace std; double zeroDivision(int x, int y) { if (y == 0) { throw "Division by Zero!"; } return (x / y); } int main() { int a = 11; int b = 0; double c = 0; try { c = zeroDivision(a, b); cout << c << endl; } catch (const char* message) { cerr << message << endl; } return 0; }
вихід:
Ось скріншот коду:
Пояснення коду:
- Включіть файл заголовка iostream у програму, щоб використовувати її функції.
- Включіть простір імен std у програму до її класів, не викликаючи її.
- Створіть функцію з іменем zeroDivision, яка приймає два цілих аргументи, x і y. Функція має повертати подвійний результат.
- Використовуйте оператор if, щоб перевірити, чи значення змінного аргументу y дорівнює 0. { позначає початок тіла if.
- Повідомлення, яке буде повернуто/кинуто, якщо y дорівнює 0.
- Кінець тіла оператора if.
- Функція zeroDivision має повертати значення x/y.
- Кінець тіла функції zeroDivision.
- Викличте метод main(). Символ { позначає початок цього методу.
- Оголосити цілочисельну змінну та присвоїти їй значення 11.
- Оголосити цілочисельну змінну b і присвоїти їй значення 0.
- Оголошіть подвійну змінну c і присвойте їй значення 0.
- Використовуйте оператор try, щоб перехопити виняток. { позначає початок тіла блоку try/catch. Код, доданий у тіло, стане захищеним кодом.
- Виклик функції zeroDivision і перехід до аргументів a і b, тобто 11 і 0. Результат цієї операції буде збережено в змінній c.
- Виведіть на консоль значення змінної c.
- Кінець тіла блоку try/catch.
- Спіймати виняток. Повернуте повідомлення про помилку буде збережено в змінній message.
- Роздрукуйте отримане повідомлення про помилку на консолі.
- Кінець корпусу фіксатора.
- Програма має повернути значення після успішного виконання.
- Кінець тіла функції main().
C++ Стандартні винятки
C++ поставляється зі списком стандартних винятків, визначених у клас. Вони описані нижче:
Виняток | Опис |
---|---|
std::виняток | Це виняток і батьківський клас усіх стандартних C++ винятки. |
std::bad_alloc | Цей виняток створює нове ключове слово. |
std::bad_cast | Це виняток, створений dynamic_cast. |
std::bad_exception | Корисний пристрій для обробки неочікуваних винятків у C++ програм. |
std::bad_typeid | Виняток, створений typeid. |
std::logic_error | Цей виняток теоретично можна виявити, прочитавши код. |
std::domain_error | Це виняток, створений після використання математично недійсного домену. |
std::invalid_argument | Виняток, створений через використання недійсних аргументів. |
std::length_error | Виняток, створений після створення великого std::string. |
std::out_of_range | Перекинутий метод. |
std::runtime_error | Це виняток, який не можна виявити, прочитавши код. |
std::overflow_error | Цей виняток кидається після виникнення математичного переповнення. |
std::range_error | Цей виняток виникає, коли ви намагаєтеся зберегти значення, що виходить за межі діапазону. |
std::underflow_error | Виняток, створений після виникнення математичного недоповнення. |
Винятки, визначені користувачем
Команда C++ Клас std::exception дозволяє нам визначати об’єкти, які можуть бути створені як винятки. Цей клас було визначено в заголовок. Клас надає нам віртуальну функцію-член під назвою what.
Ця функція повертає послідовність символів типу char * із закінченням нулем. Ми можемо перезаписати його в похідних класах, щоб мати опис винятку.
приклад:
#include <iostream> #include <exception> using namespace std; class newException : public exception { virtual const char* what() const throw() { return "newException occurred"; } } newex; int main() { try { throw newex; } catch (exception& ex) { cout << ex.what() << '\n'; } return 0; }
вихід:
Ось скріншот коду:
Пояснення коду:
- Включіть файл заголовка iostream у нашу програму. Ми будемо використовувати його функції без помилок.
- Включіть файл заголовка винятку в нашу програму. Ми будемо використовувати його функції так без помилок.
- Включіть простір імен std у нашу програму, щоб використовувати його класи без його виклику.
- Створіть новий клас під назвою newException. Цей клас успадковує клас винятків C++.
- Початок корпусу класу.
- Перезаписати віртуальну функцію-член what(), визначену у файлі заголовка винятку. Потім ми опишемо наш власний виняток, новий виняток.
- Розпочніть визначення нового винятку.
- Повідомлення, яке буде повернуто, якщо буде виявлено новий виняток.
- Кінець визначення нового винятку.
- Кінець тіла класу newException. Newex — це ім’я, яке буде використано для перехоплення нашого нового винятку, після якого буде викликано newException.
- Виклик функції main(). Логіку програми слід додати в її тіло. { позначає початок його тіла.
- Використовуйте оператор try, щоб позначити код, у якому потрібно позначити виняток. { позначає початок тіла блоку try/catch. Код, оточений цим, стане захищеним.
- Викинути виняток newex, якщо він перехоплений.
- Кінець тіла спроби.
- Використовуйте оператор catch, щоб перехопити виняток. Повідомлення про помилку винятку буде збережено в змінній ex.
- Роздрукуйте повідомлення про помилку виняткової ситуації на консолі.
- Кінець тіла оператора catch.
- Програма має повернути значення, якщо вона виконується успішно.
- Кінець тіла функції main().
Підсумки
- З обробкою винятків C++, ви можете обробляти помилки виконання.
- Помилки виконання — це помилки, які виникають під час виконання програми.
- Обробка винятків допомагає вам впоратися з будь-якими несподіваними обставинами у вашій програмі.
- При виникненні несподіваної обставини управління програмою передається обробникам.
- Щоб перехопити виняток, ви розміщуєте розділ коду під блоком try-catch.
- Ключове слово throw допомагає програмі створювати винятки, допомагаючи програмі впоратися з проблемою.
- Ключове слово try допомагає визначити блок коду, для якого будуть активовані певні винятки.
- Ми можемо перезаписати функцію what() файлу заголовка винятку, щоб визначити наші винятки.