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.

Глава 12. Обработка на изключения 439<br />

- По време на четенето на данните може да възникне непредвидено<br />

изключение (например, ако файлът се намира на отдалечено мрежово<br />

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

- Между инициализирането и затварянето на потоците се изпълни<br />

операторът return.<br />

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

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

защото четецът ще се затвори правилно само в последния случай (ако не<br />

възникнат никакви изключения). Във всички останали случаи четецът няма<br />

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

файла няма да се извика. Имаме проблем, макар и да не взимаме под<br />

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

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

и break, което също ще доведе до незатваряне на потоците.<br />

Освобождаване на ресурси – решение на проблема<br />

Демонстрирахме, че схемата "отваряме файл, четем го, затваряме го"<br />

концептуално е грешна, защото ако при четенето възникне изключение,<br />

файлът ще си остане отворен. Как тогава трябва да напишем кода, така<br />

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

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

try-finally. Ще разгледаме първо пример с един ресурс (в случая<br />

файл), а след това и с два и повече ресурса.<br />

Сигурното затваряне на файл (поток) може да се извърши по следния<br />

начин:<br />

static void ReadFile(string fileName)<br />

{<br />

TextReader reader = null;<br />

try<br />

{<br />

reader = new StreamReader(fileName);<br />

string line = reader.ReadLine();<br />

Console.WriteLine(line);<br />

}<br />

finally<br />

{<br />

// Always close "reader" (first check if properly opened)<br />

if (reader != null)<br />

{<br />

reader.Close();<br />

}<br />

}<br />

}

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

Saved successfully!

Ooh no, something went wrong!