Ц ++

Руковање изузецима у Ц ++

Руковање изузецима у Ц ++
Постоје три врсте софтверских грешака. То су синтаксне грешке, логичке и рунтиме грешке.

Синтаксне грешке

Погрешно откуцан израз, изјава или конструкција је синтаксна грешка.

Размотрите следеће две изјаве:

инт арр [] = 1, 2, 3; // исправан
инт арр = 1, 2, 3; // синтаксна грешка, недостаје []

Они су дефиниције истог низа. Прва је тачна. Недостаје други [], а то је синтаксна грешка. Програм са синтаксном грешком не успева да се компајлира. Компилација не успева са поруком о грешци која указује на синтаксну грешку. Добра ствар је што се синтаксна грешка увек може исправити ако програмер зна шта ради.

Логиц Еррор

Логичка грешка је грешка коју програмер почини када се изврши неко погрешно логичко кодирање. То може бити резултат незнања програмера у вези са карактеристикама програмског језика или неразумевања шта програм треба да ради.

У овој ситуацији програм се успешно саставља. Програм добро функционише, али даје погрешне резултате. Таква грешка може бити због понављања петље пет пута када је направљено да се понови 10 пута. Може бити и да је петља несвесно направљена да се бескрајно понавља. Једини начин за решавање ове врсте грешке је пажљиво програмирање и темељно тестирање програма пре него што га предате купцу.

Рунтиме Грешке

Погрешни или изузетни улази узрокују грешке при извршавању. У овом случају, програм је успешно састављен и добро функционише у многим ситуацијама. У одређеним ситуацијама, програм се руши (и зауставља).

Замислите да у сегменту програмског кода 8 мора бити подељено са одређеним бројем именитеља. Дакле, ако се бројилац 8 подели са називником 4, одговор (количник) би био 2. Међутим, ако корисник унесе 0 као називник, програм ће се срушити. Дељење са 0 није дозвољено у математици, а такође није дозвољено ни у рачунарству. Дељење нулом треба спречити у програмирању. Обрада изузетака обрађује грешке током извођења, попут дељења по нули. Следећи програм показује како се решава проблем поделе по нули без употребе функције изузетка у Ц ++:

#инцлуде
коришћење простора имена стд;
инт маин ()

инт бројилац = 8;
инт називник = 2;
ако (називник != 0)

инт резултат = бројник / називник;
цоут << result << '\n';

иначе

цоут << "Division by zero is not permitted!" << '\n';

ретурн 0;

Излаз је 4. Да је називник 0, излаз би био:

„Дељење нулом није дозвољено!”

Главни код овде је иф-елсе конструкција. Ако називник није 0, извршиће се подела; ако је 0, подела се неће извршити. Кориснику ће бити послата порука о грешци, а програм наставља да ради без пада. Рутацијске грешке обично се решавају избегавањем извршавања сегмента кода и слањем поруке о грешци кориснику.

Изузетак у Ц ++-у користи три-блоцк за иф-блоцк и цатцх-блоцк за елсе-блоцк за обраду грешке, баш како следи:

#инцлуде
коришћење простора имена стд;
инт маин ()

инт бројник = 8;
инт називник = 2;
покушати

ако (називник != 0)

инт резултат = бројник / називник;
цоут << result << '\n';

иначе

бацити 0;


ухватити (инт ерр)

ако (грешка == 0)
цоут << "Division by zero is not permitted!" << '\n';

ретурн 0;

Имајте на уму да заглавље три нема аргумент. Такође имајте на уму да цатцх-блоцк, који је попут дефиниције функције, има параметар. Тип параметра мора бити исти као и операнд (аргумент) бацања-израза. Израз бацања налази се у блоку три. Баца аргумент по избору програмера који је повезан са грешком, а цатцх-блоцк је хвата. На тај начин се не извршава код у три-блоку. Затим, цатцх-блоцк приказује поруку о грешци.

Овај чланак објашњава руковање изузецима у језику Ц++. Основно знање на језику Ц ++ предуслов је да читалац разуме овај чланак.

Садржај чланка:

  • Функција бацања изузетка
  • Више блокова улова за један блок покушаја
  • Угњежђени блокови за покушај / улов
  • ноекцепт-специфиер
  • Посебна функција стд :: терминате ()
  • Закључак

Функција бацања изузетка:

Функција такође може да изузме изузетак баш као и оно што ради проба-блок. Бацање се одвија у оквиру дефиниције функције. Следећи програм то илуструје:

#инцлуде
коришћење простора имена стд;
воид фн (цонст цхар * стр)

иф (исловер (стр [0]))
бацити 'л';

инт маин ()

покушати

фн ("ковач");

улов (цхар цх)

ако (цх == 'л')
цоут << "Person's name cannot begin in lowercase!" << '\n';

ретурн 0;

Приметите да овај пут блок три има само позив функције. Позвана функција има операцију бацања. Блок цатцх хвата изузетак, а излаз је:

„Име особе не може почињати малим словима!”

Овај пут, бачени и ухваћени тип је цхар.

Више блокова хватања за један покушај блока:

За један покушај може бити више блокова хватања. Замислите ситуацију у којој улаз може бити било који од знакова тастатуре, али не цифра и не абецеда. У овом случају морају постојати два блока за улов: један за цео број за проверу цифре и један за знак за проверу абецеде. Следећи код то илуструје:

#инцлуде
коришћење простора имена стд;
цхар инпут = '*';
инт маин ()

покушати

иф (исдигит (инпут))
бацање 10;
иф (исалпха (инпут))
бацити 'з';

ухватити (инт)

цоут << "Digit input is forbidden!" << '\n';

улов (цхар)

цоут << "Character input is forbidden!" << '\n';

ретурн 0;

Нема резултата. Ако је вредност уноса цифра, нпр.г., '1', излаз би био:

„Унос цифара је забрањен!"

Ако је вредност уноса абецеда, нпр.г., 'а', излаз би био:

„Унос знакова је забрањен!"

Имајте на уму да на листи параметара два блока за улов нема име идентификатора. Такође имајте на уму да у дефиницији два блока за улов нису изведени конкретни бачени аргументи да ли су њихове вредности тачне или не.

За улов је важан тип; улов мора одговарати врсти баченог операнда. Одређена вредност баченог аргумента (операнда) може се користити за даљу верификацију ако је потребно.

Више од једног руковаоца за исти тип

Могуће је имати два руковаоца истог типа. Када се изузме изузетак, контрола се преноси на најближи обрађивач са одговарајућим типом. Следећи програм то илуструје:

#инцлуде
коришћење простора имена стд;
цхар инпут = '1';
инт маин ()

покушати

иф (исдигит (инпут))
бацање 10;

ухватити (инт)

цоут << "Digit input is forbidden!" << '\n';

ухватити (инт)

цоут << "Not allowed at all: digit input!" << '\n';

ретурн 0;

Излаз је:

„Унос цифара је забрањен!"

Угњежђени блокови за покушај / улов:

три / цатцх блокови се могу угнездити. Овде се понавља горњи програм за унос неалфанумеричких знакова са тастатуре, али са угнежђеним абецедним кодом грешке:

#инцлуде
коришћење простора имена стд;
цхар инпут = '*';
инт маин ()

покушати

иф (исдигит (инпут))
бацање 10;
покушати

иф (исалпха (инпут))
бацити 'з';

улов (цхар)

цоут << "Character input is forbidden!" << '\n';


ухватити (инт)

цоут << "Digit input is forbidden!" << '\n';

ретурн 0;

Абецедни блок покушаја / хватања грешке угнежђен је у блок покушаја цифреног кода. Рад овог програма и претходна операција из које је копиран су исти.

ноекцепт-специфиер

Узмите у обзир следећу функцију:

воид фн (цонст цхар * стр), осим

иф (исловер (стр [0]))
бацити 'л';

Обратите пажњу на спецификатор 'ноекцепт' одмах након десне заграде листе параметара функције. То значи да функција не би требало да изузме изузетак. Ако функција избаци изузетак, као у овом случају, компајлираће се са поруком упозорења, али се неће покренути. Покушај покретања програма позваће посебну функцију стд :: терминате (), која би требало да грациозно заустави програм, уместо да му дозволи само буквално пад.

Спецификатор ноекцепт је у различитим облицима. То су следећи:

укуцајте фунц () ноекцепт; : не дозвољава израз бацања
укуцајте фунц () ноекцепт (труе); : дозвољава израз бацања
укуцајте фунц () тхров (); : не дозвољава израз бацања
укуцајте фунц () ноекцепт (фалсе); : дозвољава израз бацања, који није обавезан
укуцајте фунц (); : дозвољава израз бацања, који није обавезан

тачно или нетачно у загради може бити замењено изразом који резултира тачним или нетачним.

Посебна функција стд :: терминате ():

Ако се изузетак не може обрадити, треба га поново бацити. У овом случају, бачени израз може или не мора имати операнд. Посебна функција стд :: терминате () позваће се током извођења, што би требало да заустави програм, уместо да дозволи да се буквално сруши.

Укуцајте, компајлирајте и покрените следећи програм:

#инцлуде
коришћење простора имена стд;
цхар инпут = '1';
инт маин ()

покушати

иф (исдигит (инпут))
бацање 10;

ухватити (инт)

бацити;

ретурн 0;

Након успешне компилације, програм се прекида без покретања, а порука о грешци са рачунара аутора гласи:

„Терминате позван након бацања инстанце 'инт'

Прекинуто (бачено језгро) ”

Закључак:

Функција изузетка у Ц ++ спречава извршење сегмента кода на основу неке врсте уноса. Програм се наставља по потреби. Конструкција за изузеће (спречавање грешака) састоји се од блока покушаја и блока хватања. Блок покушаја има сегмент кода од интереса који се може заобићи, у зависности од неких условних услова. Блок три има израз бацање, који баца операнд. Овај операнд се назива и изузетком. Ако су тип операнда и тип за параметар блока цатцх исти, тада је изузетак ухваћен (обрађен). Ако се изузетак не ухвати, програм ће бити прекинут, али ипак будите сигурни јер сегмент кода који је требало да се изврши да би дао погрешан резултат није извршен. Типично руковање изузецима подразумева заобилажење сегмента кода и слање поруке о грешци кориснику. Сегмент кода се извршава за нормалан унос, али се заобилази за погрешне уносе.

Инсталирајте најновији Долпхин Емулатор за Гамецубе & Вии на Линук
Долпхин Емулатор вам омогућава да играте изабране игре Гамецубе и Вии на Линук Персонал Цомпутерс (ПЦ). Долпхин Емулатор је слободно доступан и емула...
Како се користи ГамеЦонкуерор Цхеат Енгине у Линуку
Чланак покрива водич о коришћењу ГамеЦонкуерор варалице у Линуку. Многи корисници који играју игре на Виндовс-у често користе апликацију „Цхеат Енгине...
Најбољи емулатори играће конзоле за Линук
Овај чланак ће навести популарни софтвер за емулацију играће конзоле доступан за Линук. Емулација је слој компатибилности софтвера који опонаша хардве...