Обробка винятків на C ++: Спробуй, злови, кинь Приклад

Зміст:

Anonim

Що таке обробка винятків у C ++?

Обробка винятків у C ++ надає вам спосіб обробки несподіваних обставин, таких як помилки виконання. Отже, коли трапляється несподівана обставина, управління програмою передається спеціальним функціям, відомим як обробники.

Щоб уловити винятки, ви розміщуєте деякий розділ коду під інспекцією винятків. Розділ коду розміщений у блоці try-catch.

Якщо в межах цього розділу коду трапляється виняткова ситуація, буде видано виняток. Далі обробник винятків візьме на себе контроль над програмою.

У разі відсутності виняткових обставин код виконуватиметься нормально. Обробники будуть проігноровані.

У цьому підручнику з C ++ ви дізнаєтесь:

  • Що таке обробка винятків у C ++?
  • Чому обробка винятків?
  • Ключові слова, що обробляють винятки
  • Синтаксис:
  • Стандартні винятки на C ++
  • Визначені користувачем винятки

Чому обробка винятків?

Ось причина використання обробки винятків у C ++:

  • Ви відокремите код обробки помилок від звичайного коду. Код стане більш читабельним і простішим в обслуговуванні.
  • Функції можуть обробляти вибрані ними винятки. Навіть якщо функція видає багато винятків, вона обробляє лише деякі. Абонент обробляє невпіймані винятки.

Ключові слова, що обробляють винятки

Обробка винятків у C ++ обертається навколо цих трьох ключових слів:

  • throw - коли програма стикається з проблемою, вона видає виняток. Ключове слово throw допомагає програмі виконати кидок.
  • catch - програма використовує обробник винятків, щоб зловити виняток. Він додається до розділу програми, де вам потрібно вирішити проблему. Це робиться за допомогою ключового слова catch.
  • try - блок try визначає блок коду, для якого будуть активовані певні винятки. Слідом за ним повинен бути один / більше блоків лову.

Припустимо, код блоку спричинить виняток. Виняток буде виявлено методом, що використовує ключові слова 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#includeusing namespace std;int main() {vector vec;vec.push_back(0);vec.push_back(1);// access the third element, which doesn't existtry{vec.at(2);}catch (exception& ex){cout << "Exception occurred!" << endl;}return 0;}

Вихід:

Ось скріншот коду:

Пояснення коду:

  1. Включіть у програму файл заголовка iostream, щоб використовувати її функції.
  2. Включіть векторний файл заголовка в програму, щоб використовувати її функції.
  3. Включіть простір імен std у програму до своїх класів, не викликаючи його.
  4. Виклик функції main (). Логіка програми повинна бути додана до її тіла.
  5. Створіть вектор з іменем vec для зберігання цілочисельних даних.
  6. Додайте елемент 0 до вектора з іменем vec.
  7. Додайте елемент 1 до вектора з іменем vec.
  8. Коментар. Він буде пропущений компілятором C ++.
  9. Використовуйте оператор try, щоб вловити виняток. Значок {позначає початок основного блоку try / catch. Код, доданий у тілі, стане захищеним кодом.
  10. Спробуйте отримати доступ до елемента, що зберігається за індексом 2 (третій елемент) вектора з іменем vec. Цей елемент не існує.
  11. Кінець основного блоку try / catch.
  12. Влаштуйте виняток. Повідомлення про помилку буде збережено у змінній ex.
  13. Роздрукуйте якесь повідомлення на консолі, якщо спіймано виняток.
  14. Кінець корпусу блоку лову.
  15. Після успішного виконання програма повинна повертати значення.
  16. Кінець основного () елемента функції.

Приклад 2:

#include 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;}

Вихід:

Ось скріншот коду:

Пояснення коду:

  1. Включіть у програму файл заголовка iostream, щоб використовувати її функції.
  2. Включіть простір імен std у програму до своїх класів, не викликаючи його.
  3. Створіть функцію з іменем zeroDivision, яка приймає два цілих аргументи, x та y. Функція повинна повернути подвійний результат.
  4. Використовуйте оператор if, щоб перевірити, чи значення аргументу змінної y дорівнює 0. {Позначає початок тіла if.
  5. Повідомлення, яке потрібно повернути / кинути, якщо y дорівнює 0.
  6. Кінець тіла оператора if.
  7. Функція zeroDivision повинна повертати значення x / y.
  8. Кінець тіла функції zeroDivision.
  9. Викличте метод main (). Значок {позначає початок цього методу.
  10. Оголосіть цілочисельну змінну та присвоївши їй значення 11.
  11. Оголосіть цілочисельну змінну b і присвоївши їй значення 0.
  12. Оголосіть подвійну змінну c і присвоївши їй значення 0.
  13. Використовуйте оператор try, щоб вловити виняток. Значок {позначає початок основного блоку try / catch. Код, доданий у тілі, стане захищеним кодом.
  14. Викличте функцію zeroDivision і перейдіть до аргументів a і b, тобто 11 і 0. Результат цієї операції буде збережений у змінній c.
  15. Надрукуйте значення змінної c на консолі.
  16. Кінець основного блоку try / catch.
  17. Влаштуйте виняток. Повідомлення про помилку буде збережено у повідомленні змінної.
  18. Роздрукуйте повідомлення про помилку на консолі.
  19. Кінець корпусу блоку лову.
  20. Після успішного виконання програма повинна повертати значення.
  21. Кінець основного () елемента функції.

Стандартні винятки на C ++

C ++ постачається зі списком стандартних винятків, визначених у класі . Вони описані нижче:

Виняток Опис
std :: виняток Це виняток і батьківський клас усіх стандартних винятків на C ++.
std :: bad_alloc Цей виняток викликає нове ключове слово.
std :: bad_cast Це виняток, створений системою dynamic_cast.
std :: bad_exception Корисний пристрій для обробки несподіваних винятків у програмах на C ++.
std :: bad_typeid Виняток, виданий typeid.
std :: error_error Цей виняток теоретично можна виявити, читаючи код.
std :: error_error Це виняток, викликаний використанням математично невірного домену.
std :: invalid_argument Виняток для використання недійсних аргументів.
std :: length_error Виняток, створений після створення великого std :: string.
std :: out_of_range Кинуто методом at.
std :: runtime_error Це виняток, який неможливо виявити за допомогою зчитування коду.
std :: overflow_error Цей виняток виникає після виникнення математичного переповнення.
std :: range_error Цей виняток виникає, коли ви намагаєтесь зберегти значення, яке не входить в діапазон.
std :: underflow_error Виняток, що виникає після виникнення математичного недопущення.

Визначені користувачем винятки

Клас C ++ std :: виняток дозволяє нам визначити об'єкти, які можна використовувати як винятки. Цей клас було визначено в заголовку . Клас надає нам функцію віртуального члена з іменем what.

Ця функція повертає послідовність символів із символом типу *, що закінчується нулем. Ми можемо перезаписати його у похідних класах, щоб мати опис винятків.

Приклад:

#include #include 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;}

Вихід:

Ось скріншот коду:

Пояснення коду:

  1. Включіть у нашу програму файл заголовка iostream. Ми будемо використовувати його функції, не отримуючи помилок.
  2. Включіть у нашу програму файл заголовка винятку. Ми будемо використовувати його функції як без помилок.
  3. Включіть простір імен std у нашу програму, щоб використовувати його класи, не викликаючи його.
  4. Створіть новий клас з назвою newException. Цей клас успадковує клас винятків C ++.
  5. Початок класу тіла.
  6. Перезапишіть функцію віртуального члена, що () визначено у файлі заголовка виключення. Потім ми опишемо власний виняток, новий виняток.
  7. Почніть визначення нового винятку.
  8. Повідомлення, яке повертається, якщо новий виняток виявлено.
  9. Кінець визначення нового винятку.
  10. Кінець тіла класу newException. Newex - це ім'я, яке буде використано для лову нашого нового винятку, після чого буде викликано newException.
  11. Виклик функції main (). Логіка програми повинна бути додана до її тіла. Значок {позначає початок його тіла.
  12. За допомогою оператора try позначте код, у межах якого нам потрібно позначити виняток. Значок {позначає початок основного блоку try / catch. Код, оточений цим, стане захищеним.
  13. Викиньте виняток newex, якщо його спіймали.
  14. Кінець тіла спроби.
  15. Використовуйте оператор catch, щоб зловити виняток. Повідомлення про помилку виключення зберігатиметься у змінній ex.
  16. Надрукуйте повідомлення про помилку на консолі.
  17. Кінець основного елемента оператора catch.
  18. Програма повинна повернути значення, якщо воно успішно виконується.
  19. Кінець тіла основної () функції.

Короткий зміст:

  • За винятком обробки винятків у C ++, ви можете обробляти помилки виконання.
  • Помилки виконання - це помилки, які виникають під час виконання програми.
  • Обробка винятків допомагає вирішити будь-які несподівані обставини у вашій програмі.
  • Коли трапляється несподівана обставина, управління програмою передається обробникам.
  • Щоб зловити виняток, ви розміщуєте розділ коду під блоком try-catch.
  • Ключове слово throw допомагає програмі кидати винятки, допомагаючи програмі вирішити проблему.
  • Ключове слово try допомагає визначити блок коду, для якого будуть активовані певні винятки.
  • Ми можемо замінити функцію what () файлу заголовка винятку, щоб визначити наші винятки.