25.07.2017 Views

Intro-CSharp-Book-v2015

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

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

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

неуспеха може да разгледа оригиналното изключение, причинител на<br />

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

сървъра за бази данни.<br />

Тези application exceptions от бизнес областта на решавания проблем, за<br />

които дадохме пример, обаче не съдържат достатъчно информация за<br />

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

тях да има и техническа информация за оригиналния причинител на<br />

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

Същото обяснение от друга гледна точка: един компонент A има дефинирани<br />

малък брой изключения (A-изключения). Този компонент използва<br />

друг компонент Б. Ако Б хвърли Б-изключение, то A не може да си свърши<br />

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

изключение, затова хвърля А-изключение, съдържащо изключението Б<br />

като вложено изключение.<br />

Защо A не може да хвърли Б-изключение? Има много причини:<br />

- Ползвателите на A не трябва да знаят за съществуването на Б (за<br />

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

принципите на ООП).<br />

- Компонентът A не е дефинирал, че ще хвърля Б-изключения.<br />

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

А-изключения.<br />

Как да разчетем "Stack Trace" на вериги<br />

изключения?<br />

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

демонстрираме как се изписва на екрана вложено изключение. Нека<br />

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

37<br />

38<br />

39<br />

40<br />

41<br />

42<br />

43<br />

44<br />

45<br />

46<br />

47<br />

48<br />

49<br />

50<br />

51<br />

static void Main()<br />

{<br />

try<br />

{<br />

string fileName = "WrongFileName.txt";<br />

ReadFile(fileName);<br />

}<br />

catch (Exception e)<br />

{<br />

throw new ApplicationException("Smth bad happened", e);<br />

}<br />

}<br />

static void ReadFile(string fileName)<br />

{<br />

TextReader reader = new StreamReader(fileName);

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

Saved successfully!

Ooh no, something went wrong!