Генериране и обработка на изключения
Механизмът за обработката на изключения в C++ предоставя стандартни, вградени в езика средства за реагиране на ненормални, грешни ситуации по време на изпълнение програмата. Механизмът на изключенията предоставя еднообразен синтаксис и стил за обработка на грешки в програмата. Той елиминира нуждата от изрични проверки за грешки и съсредоточава кода за обработка на грешки в отделни части на програмата.
Основните компоненти, които формират механизма за обработка на изключения в C++ са следните:
-
При възникване на ненормална ситуация в програмата, програмистът сигнализира за настъпването й чрез генерирането на изключение. Когато се генерира изключение нормалното изпълнение на програмата се прекратява докато изключението не бъде обработено. В C++ за генериране на изключение се използва ключовата дума
throw
. Например, в следния фрагмент в ред 8 се генерира изключение от типаStackError
ако се опитаме да прочетем елемент от празен стек:class StackError { ... }; class Stack { ... public: ... int pop(void) { if(top_<=0) throw StackError(); return data_[--top_]; } ... }
- Точка в програмата, където генерираното изключение се обработва. Най-често изключенията в програмата се генерират и обработват от различни функции. Намирането на секция за обработка на генерирано изключение често води до развиване на програмния стек. След като изключението бъде обработено изпълнението на програмата продължава нормално. Възстановяването на изпълнението на програмата обаче става не от точката на генериране на изключението, а от точката, където изключението е било обработено. В C++ обработката на изключенията се изпълнява в
catch
-секции. Например, в следващатаcatch
-секция се обработва изключението, генерирано в предходния фрагмент:catch(StackError ex) { log_error(ex); exit(1); }
- Всяка една
catch
-секция трябва да се асоциира сtry
-блок. В единtry
-блок се групират един или повече оператори, които могат да генерират изключения, с една или повечеcatch
-секции. Например:try { // Използване на обекти от класа Stack ... } catch(StackError ex) { // Обработка на грешка при използването на стека ... } catch(...) { // Обработка на всички останали грешки ... }
Ако се генерира изключение от типа
StackError
, то ще бъде прихванато и обработено отcatch
-секцията в ред 4. Използването на секцияcatch(...)
, където вместо тип на изключението се използва многоточие, означава, че тазиcatch
-секция прихваща изключения от всякакъв тип. Следователно всички изключения, генерирани вtry
-блока, които не са от типаStackError
ще бъдат прихванати и обработени отcatch
-секцията в ред 7.
Pingback: CPP-101: Кратък обзор на езика за програмиране C++ | Записки по програмиране