Виняток є помилкою, що відбувається під час виконання програми. За допомогою підсистеми обробки винятків для C# можна обробляти такі помилки, не викликаючи краху програми. Для цього використовується інструкція try-catch.
Ця інструкція складається з блоку try, за яким слідує одна або кілька пропозицій catch, в яких визначаються обробники для різних винятків.
У програмі вводиться два числа та обчислюється їх частка.
Вся програма міститься в блок try. У блоці catch оператор виводить повідомлення про помилку.
Якщо в пропозиції catch немає параметрів, то вона працює для будь-яких винятків.
Програма зчитує два числа та виконує ділення. Якщо виникає помилка (наприклад, ділення на нуль), вона буде оброблена блоком try-catch.
static void Main(string[] args)
{
int i, n, m;
try
{
Console.WriteLine("Введення");
n = Convert.ToInt32(Console.ReadLine());
i = Convert.ToInt32(Console.ReadLine());
m = n / i;
Console.WriteLine("Вивід {0}:{1}={2}", n, i, m);
}
catch
{
Console.WriteLine("Помилка!!");
}
Console.ReadKey();
}
try – пробує виконати критичну частину коду (ділення).catch – виконується, якщо сталася помилка (наприклад, ділення на 0).Console.ReadLine() – зчитує введене користувачем число.Convert.ToInt32() – перетворює текст у ціле число.Console.WriteLine() – виводить результат або повідомлення про помилку.| n (ділене) | i (дільник) | Результат | Вивід |
|---|---|---|---|
| 10 | 2 | 10 / 2 = 5 | Вивід 10:2=5 |
| 10 | 0 | Ділення на 0 | Помилка!! |
| abc | 2 | Формат введення некоректний | Помилка!! |
| 8 | xyz | Формат введення некоректний | Помилка!! |
Якщо у програмі не виникають винятки, то виконуються оператори із блоку try. Оператори блоку catch пропускаються.
Якщо у програмі виникне будь-який виняток, то виконання операторів блоку try переривається і починають виконуватися оператори з блоку catch.
У даному випадку і при діленні на 0, і при неправильному введенні виводиться те саме повідомлення.
Якщо ми хочемо по-різному обробляти винятки, то його тип потрібно вказувати в блоці catch як параметр.
Змінимо попереднє завдання. Тепер оброблятимемо окремо два винятки: ділення на 0 (DivideByZeroException) та неправильний формат вхідного рядка (FormatException).
static void Main(string[] args)
{
int i, n, m;
try
{
Console.WriteLine("Введіть два числа:");
n = Convert.ToInt32(Console.ReadLine());
i = Convert.ToInt32(Console.ReadLine());
m = n / i;
Console.WriteLine("Результат: {0} / {1} = {2}", n, i, m);
}
catch (FormatException)
{
Console.WriteLine("Введений рядок мав неправильний формат!");
}
catch (DivideByZeroException)
{
Console.WriteLine("Ділення на 0!!!");
}
Console.ReadKey();
}
| № | Вхідні значення (n, i) | Очікуваний результат | Фактичний результат | Примітка |
|---|---|---|---|---|
| 1 | 10, 2 | 10:2=5 | 10:2=5 | Успішне ділення |
| 2 | 15, 3 | 15:3=5 | 15:3=5 | Успішне ділення |
| 3 | 7, 0 | Помилка!! | Помилка!! | Ділення на нуль |
| 4 | abc, 5 | Помилка!! | Помилка!! | Невірний ввід |
Надалі ми будемо самі генерувати винятки та обробляти їх