Увод

Ако си успешно савладао градиво из претходних лекција, стекао си добре основе из програмирања у програмском језику C#, као и основе из објектно-оријентисаног програмирања. Међутим, у претходним лекцијама претварали смо се да је увек све у реду, да је рачунарски систем на којој се твоја апликација извршава савршен и да ће корисници твоје апликације увек користити твоју апликацију онако како си ти то предвидео. Реалност је потпуно другачија. Оперативни системи нису савршени, рачунарски хардвер склон је грешкама и кваровима, а корисници твоје апликације ће несвесно пронаћи све начине да изазову њено непредвиђено понашање. Наравно и ти, као творац апликације, правићеш разне грешке које могу да изазову непредвиђено понашање апликације.

Грешке

Грешке у функционисању твоје апликације могу бити опасне и по функционисање других апликација или читавог система - могу изазвати непредвиђено понашање или рушење система, а могу омогућити и неовлашћени приступ систему и подацима, као и друге сигурносне пропусте. Чак ни велике софтверске компаније са стотинама запослених искусних програмера не могу саме да се изборе са грешкама. Доказ за то су тзв. програми лова на багове (енгл. Bug Bounty Programs), у оквиру којих се финансијски награђују корисници који пронађу грешке у функционисању неких апликација. Колико су честе грешке у свету информационих технологија говори ти и то да су се у српском језику одомаћили изрази „да нешто има баг”, односно „да нешто багује”.

Грешке са којима си се сусретао до сада грубо се могу поделити на:

  • Синтаксне грешке - грешке које настају када унесеш кôд који нарушава синтаксна правила програмског језика. На пример, када изоставиш ; на крају наредбе, када погрешно наведеш име функције и сл. Овакве грешке си откривао током компајлирања програма, јер оне резултују прецизном поруком о грешци.

  • Семантичке грешке - грешке у твојој логици програмског решења. На пример, када погрешно дефинишеш условни израз у наредби гранања или функцији проследиш погрешан параметар и сл. Овакве грешке резултују неисправним резултатима приликом извршавања програма. Њих си теже откривао, јер се програм успешно компајлирао без порука о грешкама. Савремена интегрисана развојна окружења, као што је Visual Studio, могу да „наслуте” неке семантичке грешке, што резултује приказом упозорења.

  • Грешке током извршавања - грешке које ниси предвидео, а које су се могле десити из много разлога када се стекну специфични услови. На пример, десило се дељење нулом, приступило се елементу низа са непостојећим индексом, понестало је меморијског простора, није било могуће уписати податке у датотеку и сл. Неке од ових грешака је можда изазвао корисник уносећи погрешне податке, неке је можда изазвао неки процес оперативног система или нека друга активна апликација, неке су можда настале због неисправног хардвера итд. Приликом следећег извршавања апликације можда се не би десила ни једна од наведених грешака.

Грешке током извршавања програма

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

  • садржи кôд за проверу и обраду грешака који се често понавља и који лоше утиче на читљивост и разумљивост логике програма,

  • захтева више ресурса на диску за складиштење апликације,

  • захтева више ресурса у меморији за извршавање апликације,

  • захтева више процесорског времена и успорава извршавање апликације.

Решење у програмском језику C#, а и у другим објектно-оријентисаним језицима, је одвајање кода логике програма од кода за проверу и обраду грешака које настају током извршавања апликације. То се постиже механизмима који се називају „изузеци” (енгл. Exceptions).

Укратко, изузетак „баца” кôд који изазива грешку. Бачени изузетак „хвата” кôд којим се управља грешком. Више о овом механизму научићеш у лекцијама које следе. Коришћењем механизма за руковање изузецима униформишеш кôд за проверу и обраду грешака, чиме кôд логике програма остаје читљив и разумљив, а апликација захтева мање ресурса и процесорског времена.