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

Какво представлява обработката на изключения 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;
}

Изход:

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

Ето екранна снимка на кода:

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

Обяснение на кода:

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

Изход:

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

Ето екранна снимка на кода:

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

Обяснение на кода:

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

Изход:

Дефинирани от потребителя изключения

Ето екранна снимка на кода:

Дефинирани от потребителя изключения

Обяснение на кода:

  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().

Oбобщение

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

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