У попередніх уроках, у деяких програмах ми не враховували непередбачені ситуації, які можуть призводити до помилок. Наприклад, коли нам необхідно було ввести число. Якщо замість числа ми ввели б рядок, то при конвертації цього рядка у чисельний тип програма б аварійно завершила роботу, і ми б отримали помилку. Такі помилки і інші непередбачені ситуації в Сі-шарп називаються винятками.
Обробка винятків – це опис реакції програми на подібні події (виключення) під час виконання програми. Реакцією програми може бути коректне завершення роботи програми, виведення інформації про помилку і запит повторення дії (при введенні даних).

Прикладами виключень може бути:
- ділення на нуль;
- конвертація некоректних даних з одного типу в інший;
- спроба відкрити файл, якого не існує;
- доступ до елемента поза рамками масиву;
- вичерпання пам'яті програми;
- інше.

Для обробки виключень в Сі-шарп використовується оператор try-catch. Він має наступну структуру:

try
{
//блок коду, в якому можливе виключення
}
catch ([тип виключення] [ім'я])
{
//блок коду – обробка винятку
}

Працює це все дуже просто. Виконується код в блоці try, і, якщо в ньому відбувається виключення типу, відповідає типу, зазначеному в catch, то управління передається блоку catch. При цьому, весь залишився код від моменту викидання винятку до кінця блоку try не буде виконаний. Після виконання блоку catch, оператор try-catch завершує роботу. Вказувати ім'я виключення не обов'язково. Виняток представляє собою об'єкт, і до нього ми маємо доступ через це ім'я. З цього об'єкта ми можемо отримати, наприклад, стандартне повідомлення про помилку (Message), або трасування стека (StackTrace), яка допоможе дізнатися місце виникнення помилки. В цьому об'єкті зберігається детальна інформації про виключення. Якщо тип викинутої винятку не буде відповідати типу, зазначеному в catch – виключення не буде опрацьовано, і програма аварійно завершить роботу.

Нижче наведено приклад програми, в якій використовується обробка винятку некоректного формату даних:

static void Main(string[] args)
{
string result = ""; 
Console.WriteLine("Введіть число:");
try
{
int a = Convert.ToInt32(Console.ReadLine()); //вводимо дані, і конвертуємо в ціле число
result = "Ви ввели число" + a;
}
catch (FormatException)
{
result = "Помилка. Ви не ввели число";
}
Console.WriteLine(result);
Console.ReadLine();
}

Результат роботи програми:







Типи винятків

Нижче наведені деякі з поширених типів виключень.
Exception – базовий тип всіх винятків. Блок catch, в якому зазначено тип Exception буде «ловити» всі винятки.
FormatException – некоректний формат операнда або аргументу (при передачі в метод).
NullReferenceException - У примірнику об'єкта не задана посилання на об'єкт, об'єкт не створено.
IndexOutOfRangeException – індекс поза рамками колекції
FileNotFoundException – файл не знайдений.
DivideByZeroException – ділення на нуль

Кілька блоків catch

Одного блоку try може відповідати кілька блоків catch:

try
{
//блок1
}
catch (FormatException)
{
//блок-обробка винятку 1
}
catch (FileNotFoundException)
{ 
//блок-обробка винятку 2
}

В залежності від того або іншого типу виключення в блоці try, виконання буде передано відповідним блоку catch.

Блок finally

Оператор try-catch також може містити блок finally. Особливість блоку finally в тому, що код всередині цього блоку виконається в будь-якому випадку, в незалежності від того, було чи виключення чи ні.

try
{
//блок1
}
catch (Exception)
{
//обробка винятку
}
finally
{
//блок коду, який обов'язково виконається
}

Выполнение кода программы в блоке finally происходит в последнюю очередь. Сначала try затем finally или catch-finally (если было исключение). Обычно, он используется для освобождения ресурсов. Классическим примером использования блока finally является закрытие файла.

Навіщо блок finally?

Дуже часто можна почути питання, для чого потрібен цей блок? Адже, здається, можна звільнити ресурси просто після оператора try-catch, без використання finally. А відповідь дуже проста. Finally гарантує виконання коду, незважаючи ні на що. Навіть якщо в блоках try або catch буде відбуватися вихід з методу за допомогою оператора return – finally виконається. Оператори try-catch також можуть бути вкладеними. Всередині блоку try або catch може бути ще один try-catch. Обробка виключень, в першу чергу, нам знадобиться при роботі з файлами. Роботі з файлами буде присвячений наступний урок.

Автор Swytos                                              << попереднянаступна >>                                                 До змісту


2016-05-29 • Просмотров [ 140 ]