Какво представлява обработката на изключения в C ++?
Обработката на изключения в C ++ ви предоставя начин за обработка на неочаквани обстоятелства като грешки по време на изпълнение. Така че, когато възникне неочаквано обстоятелство, управлението на програмата се прехвърля към специални функции, известни като манипулатори.
За да уловите изключенията, поставяте част от кода под проверка на изключенията. Разделът на кода се поставя в блока try-catch.
Ако възникне изключителна ситуация в рамките на този раздел на кода, ще бъде създадено изключение. След това манипулаторът на изключения ще поеме контрола върху програмата.
В случай, че не възникнат изключителни обстоятелства, кодът ще се изпълни нормално. Манипулаторите ще бъдат игнорирани.
В този урок за C ++ ще научите:
- Какво представлява обработката на изключения в C ++?
- Защо обработка на изключения?
- Ключ за обработка на изключения
- Синтаксис:
- C ++ стандартни изключения
- Дефинирани от потребителя изключения
Защо обработка на изключения?
Ето причината за използването на обработка на изключения в C ++:
- Ще отделите кода си за обработка на грешки от нормалния си код. Кодът ще бъде по-четлив и по-лесен за поддръжка.
- Функциите могат да се справят с избраните от тях изключения. Дори ако функция хвърля много изключения, тя ще се справи само с някои. Повикващият ще се справи с незаловените изключения.
Ключ за обработка на изключения
Обработката на изключения в C ++ се върти около тези три ключови думи:
- хвърляне - когато дадена програма срещне проблем, тя хвърля изключение. Ключовата дума throw помага на програмата да извърши хвърлянето.
- catch - програма използва манипулатор на изключения, за да улови изключение. Той се добавя към раздела на програма, където трябва да се справите с проблема. Това се прави с помощта на ключовата дума catch.
- try - блокът try описва кодовия блок, за който ще бъдат активирани определени изключения. Следва да бъде последван от един / повече блокове за улов.
Да предположим, че кодов блок ще предизвика изключение. Изключението ще бъде уловено от метод, използващ ключови думи try and 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}
- Въпреки че имаме едно твърдение за опит, можем да имаме много изявления за улов.
- Името на изключението е името на изключението, което трябва да бъде уловено.
- Изключение1, изключение2 и изключениеN са вашите дефинирани имена за препращане към изключенията.
Пример 1:
#include#include using 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;}
Изход:
Ето екранна снимка на кода:
Обяснение на кода:
- Включете заглавния файл на iostream в програмата, за да използвате нейните функции.
- Включете векторния заглавен файл в програмата, за да използвате нейните функции.
- Включете std пространството от имена в програмата към нейните класове, без да го извиквате.
- Извикайте функцията main (). Логиката на програмата трябва да бъде добавена в нейното тяло.
- Създайте вектор с име vec за съхраняване на целочислени данни.
- Добавете елемента 0 към вектора, наречен vec.
- Добавете елемента 1 към вектора с име vec.
- Коментар. Той ще бъде пропуснат от компилатора C ++.
- Използвайте инструкцията try, за да хванете изключение. Символът {маркира началото на тялото на блока try / catch. Кодът, добавен в тялото, ще се превърне в защитен код.
- Опитайте се да получите достъп до елемента, съхраняван в индекс 2 (трети елемент) на вектора, наречен vec. Този елемент не съществува.
- Край на тялото на блока try / catch.
- Хванете изключението. Върнатото съобщение за грешка ще се съхранява в променливата ex.
- Разпечатайте някакво съобщение на конзолата, ако изключението е уловено.
- Край на тялото на блока за улов.
- Програмата трябва да върне стойност при успешно изпълнение.
- Край на тялото на основната () функция.
Пример 2:
#includeusing 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.
- Хванете изключението. Върнатото съобщение за грешка ще се съхранява в съобщението на променливата.
- Отпечатайте върнатото съобщение за грешка на конзолата.
- Край на тялото на блока за улов.
- Програмата трябва да върне стойност при успешно изпълнение.
- Край на тялото на основната () функция.
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 :: изключение ни позволява да дефинираме обекти, които могат да бъдат хвърлени като изключения. Този клас е дефиниран в заглавката
Тази функция връща последователност от символи от тип char * с край до нула. Можем да го презапишем в производни класове, за да има описание на изключение.
Пример:
#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;}
Изход:
Ето екранна снимка на кода:
Обяснение на кода:
- Включете заглавния файл на iostream в нашата програма. Ще използваме неговите функции, без да получаваме грешки.
- Включете заглавния файл на изключението в нашата програма. Ще използваме функциите му като какво без грешки.
- Включете std пространството от имена в нашата програма, за да използвате неговите класове, без да го извиквате.
- Създайте нов клас с име newException. Този клас наследява класа на изключенията на C ++.
- Началото на тялото на класа.
- Презапишете функцията за виртуален член какво () дефинира в заглавния файл на изключението. След това ще опишем нашето собствено изключение, новото изключение.
- Започнете дефиницията на новото изключение.
- Съобщението, което трябва да бъде върнато, ако бъде уловено новото изключение.
- Край на дефиницията на новото изключение.
- Край на тялото на клас newException. Newex е името, което ще се използва за улавяне на новото ни изключение, след което newException ще бъде извикан.
- Извикайте функцията main (). Логиката на програмата трябва да бъде добавена в нейното тяло. {Отбелязва началото на тялото му.
- Използвайте инструкция try, за да маркирате кода, в който трябва да маркираме изключението. Символът {маркира началото на тялото на блока try / catch. Кодът, заобиколен от това, ще стане защитен.
- Хвърлете изключението newex, ако е уловено.
- Край на опита на тялото.
- Използвайте оператора catch, за да уловите изключението. Съобщението за грешка при изключение ще се съхранява в променлива ex.
- Отпечатайте съобщението за грешка на изключението на конзолата.
- Край на тялото на изявлението за улов.
- Програмата трябва да върне стойност, ако се изпълни успешно.
- Край на тялото на основната () функция.
Резюме:
- С обработка на изключения в C ++ можете да обработвате грешки по време на изпълнение.
- Грешките по време на изпълнение са грешките, които възникват по време на изпълнение на програмата.
- Обработката на изключения ви помага да се справите с всички неочаквани обстоятелства във вашата програма.
- Когато възникне неочакваното обстоятелство, управлението на програмата се прехвърля на манипулаторите.
- За да уловите изключение, поставяте секция от код под блока try-catch.
- Ключовата дума throw помага на програмата да хвърля изключения, като помага на програмата да се справи с проблема.
- Ключовата дума try помага да се идентифицира кодовият блок, за който ще бъдат активирани определени изключения.
- Можем да презапишем функцията what () на заглавния файл на изключението, за да дефинираме нашите изключения.