C++ Обробка винятків: Try, Catch, throw Приклад

⚡ Розумний підсумок

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

  • ⚠️ Що це: Обробка винятків виявляє помилки під час виконання, щоб програма могла відновитися.
  • 🔑 Ключові слова: Він використовує try для перевірки коду, throw для підвищення рівня та catch для обробки помилок.
  • 🧾 Синтаксис: Помістіть ризикований код у блок try та обробляйте помилки у блоках catch.
  • 📚 Стандартні винятки: C++ забезпечує вбудовані винятки у заголовку винятку.
  • 🤖 Допомога ШІ: Інструменти штучного інтелекту, такі як GitHub Copilot, додають блоки try-catch та обробку помилок.

C++ Обробка винятків

У чому полягає обробка винятків 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;
}

вихід:

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

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

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

Code Пояснення:

  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. Кінець тіла функції 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;
}

вихід:

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

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

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

Code Пояснення:

  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. Спіймати виняток. Повернуте повідомлення про помилку буде збережено в змінній message.
  18. Роздрукуйте отримане повідомлення про помилку на консолі.
  19. Кінець корпусу фіксатора.
  20. Програма має повернути значення після успішного виконання.
  21. Кінець тіла функції main().

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

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

вихід:

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

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

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

Code Пояснення:

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

Поширені запитання

Обробка винятків – це спосіб виявлення помилок під час виконання та реагування на них у C++ використовуючи ключові слова try, throw та catch, щоб програма могла відновитися, а не аварійно завершити роботу.

C++ використовує три ключові слова: try обгортає код, який може завершитися невдачею, throw викликає виняток, коли виникає помилка, і catch обробляє викинутий виняток.

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

Стандартні винятки – це вбудовані класи винятків у заголовку винятку, такі як std::bad_alloc та std::out_of_range, які повідомляють про поширені помилки під час виконання.

Користувацький виняток — це користувацький клас, часто похідний від std::exception, який перевизначає функцію what() для опису вашої власної конкретної помилки.

Помічники штучного інтелекту, такі як GitHub Copilot, обгортають ризикований код у блоки try-catch, генерують власні класи винятків і пропонують, які винятки перехоплювати під час введення тексту.

Так. Інструменти на базі штучного інтелекту виявляють необроблені винятки, пропонують конкретні блоки catch замість загальних і додають змістовні повідомлення про помилки, що робить ваш C++ код більш надійний.

throw викликає виняток, коли виявляється помилка, тоді як catch отримує цей виняток і запускає код, який обробляє або повідомляє про помилку.

Підсумуйте цей пост за допомогою: