C++ Обработка на изключения: Пример за опит, хващане, хвърляне

⚡ Умно обобщение

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

  • ⚠️ Какво е: Обработката на изключения улавя грешки по време на изпълнение, така че програмата да може да се възстанови.
  • 🔑 Ключови думи: Използва try за тестване на код, throw за повишаване на стойността и catch за обработка на грешки.
  • 🧾 Синтаксис: Поставете рисков код в блок try и обработвайте грешките в блокове catch.
  • ???? Стандартни изключения: C++ предоставя вградени изключения в заглавката на изключенията.
  • 🤖 Помощ с изкуствен интелект: Инструменти с изкуствен интелект като GitHub Copilot добавят блокове try-catch и обработка на грешки.

C++ Изключение Handling

Какво представлява обработката на изключения C++?

Обработка на изключения C++ ви предоставя начин за справяне с неочаквани обстоятелства като грешки по време на изпълнение. Така че, когато възникне неочаквано обстоятелство, управлението на програмата се прехвърля към специални функции, известни като манипулатори.

За да уловите изключенията, поставяте част от кода под проверка на изключение. Частта от код се поставя в блока try-catch.

Ако възникне изключителна ситуация в този раздел от кода, ще бъде хвърлено изключение. След това манипулаторът на изключения ще поеме контрола над програмата.

В случай, че не възникнат извънредни обстоятелства, кодът ще се изпълни нормално. Манипулаторите ще бъдат игнорирани.

В този C++ урок, ще научите:

Защо обработка на изключения?

Ето причината за използването на обработка на изключения в C++:

  • Ще отделите своя код за обработка на грешки от нормалния си код. Кодът ще бъде по-четлив и по-лесен за поддръжка.
  • Функциите могат да обработват избраните от тях изключения. Дори ако дадена функция хвърля много изключения, тя ще обработи само някои. Обаждащият се ще обработва неуловените изключения.

Ключови думи за обработка на изключения

Обработка на изключения C++ се върти около тези три ключови думи:

  • хвърлям– когато една програма срещне проблем, тя хвърля изключение. Ключовата дума throw помага на програмата да извърши хвърлянето.
  • улов– програмата използва манипулатор на изключения, за да улови изключение. Добавя се към секцията на програма, където трябва да се справите с проблема. Това се прави с помощта на ключовата дума catch.
  • опитвам– блокът 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<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. Хвани изключението. Върнатото съобщение за грешка ще бъде съхранено в променливото съобщение.
  18. Разпечатайте върнатото съобщение за грешка на конзолата.
  19. Край на тялото на блока за захващане.
  20. Програмата трябва да върне стойност при успешно изпълнение.
  21. Край на тялото на функцията main().

C++ Стандартни изключения

C++ Стандартни изключения

C++ идва със списък от стандартни изключения, дефинирани в клас. Те са описани по-долу:

изключение Descriptйон
std::изключение Това е изключение и родителският клас на всички стандартни C++ изключения.
std::bad_alloc Това изключение се хвърля от нова ключова дума.
std::bad_cast Това е изключение, хвърлено от dynamic_cast.
std::лошо_изключение Полезно устройство за обработка на неочаквани изключения в C++ програми.
std::bad_typeid Изключение, хвърлено от typeid.
std::logic_error Това изключение е теоретично откриваемо чрез четене на код.
std::domain_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::exception class ни позволява да дефинираме обекти, които могат да бъдат хвърлени като изключения. Този клас е дефиниран в заглавка. Класът ни предоставя виртуална членска функция, наречена 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. Край на основния текст на изявлението за улов.
  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, генерират персонализирани класове изключения и предлагат кои изключения да се улавят, докато пишете.

Да. Инструментите, задвижвани от изкуствен интелект, забелязват необработени изключения, предлагат специфични блокове за улавяне вместо общи и добавят смислени съобщения за грешки, което прави вашето C++ кодът е по-стабилен.

throw поражда изключение, когато бъде открита грешка, докато catch получава това изключение и изпълнява кода, който обработва или докладва грешката.

Обобщете тази публикация с: