25.07.2017 Views

Intro-CSharp-Book-v2015

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

454 Въведение в програмирането със C#<br />

той не трябва да хвърля IndexOutOfRangeException, тъй като това<br />

изключение не е от бизнес областта на банковия сектор и олихвяването.<br />

Нормално е олихвяването в банковия софтуер да хвърли изключение<br />

InvalidInterestException с подходящо съобщение за грешка от бизнес<br />

областта на банките, за което би могло да бъде закачено (вложено)<br />

оригиналното изключение IndexOutOfRangeException.<br />

Представете си да сте си купили билет за автобус и пристигайки на<br />

автогарата омаслен монтьор ви обяснява, че ходовата част на автобуса има<br />

нужда от регулиране и кормилната рейка е нестабилна. Освен, ако не сте<br />

монтьор или специалист по автомобили, тази информация не ви помага с<br />

нищо. Нито става ясно колко ще се забави вашето пътуване, нито дали<br />

въобще ще пътувате. Вие очаквате, ако има проблем, да ви посрещне<br />

усмихната девойка от фирмата-превозвач и да ви обясни, че резервният<br />

автобус ще дойде след 10 минути и до тогава можете да изчакате на топло<br />

в кафенето.<br />

Същото е при програмирането – ако хвърляте изключения, които не са от<br />

бизнес областта на компонента или класа, който разработвате, има голям<br />

шанс да не ви разберат и грешката да не бъде обработена правилно.<br />

Можем да дадем още един пример: извикваме метод, който сортира масив<br />

с числа и той хвърля изключение TransactionAbortedException. Това е също<br />

толкова неадекватно съобщение, колкото и NullReferenceException при<br />

изпълнение на олихвяването в една банка. Веднага ще си помислите "Каква<br />

транзакция, какви пет лева? Нали сортираме масив!" и този въпрос е<br />

напълно адекватен. Затова се съобразявайте с нивото на абстракция, на<br />

което работи даденият метод, когато хвърляте изключение от него.<br />

Ако изключението има причинител, запазвайте го!<br />

Винаги, когато при прихващане на изключение хвърляте ново изключение<br />

от по-високо ниво на абстракция, закачайте за него оригиналното<br />

изключение. По този начин ползвателите на вашия код ще могат по-лесно<br />

да установят точната причина за грешката и точното място, където тя<br />

възниква в началния момент.<br />

Това правилo е частен случай на по-генералното правило:<br />

Всяко изключение трябва да носи в себе си максимално<br />

подробна информация за настъпилия проблем.<br />

От горното правило произтичат много други по-конкретни правила,<br />

например, че съобщението за грешка трябва да е адекватно, че типът<br />

на съобщението трябва да е адекватен на възникналия проблем, че<br />

изключението трябва да запазва причинителя си и т.н.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!