1. Ковалюк Т.В. Обробка виключних ситуацій на C# 1/50 1
Лектор доцент кафедри ПСТ ФІТ КНУ імені Тараса Шевченка
Ковалюк Т.В. , к.т.н.
2. 2/50Ковалюк Т.В. Обробка виключних ситуацій на C#
План лекції
4
Постановка проблеми та її актуальність1
2
3
5
Мета та завдання лекції
Поняття винятків
Приклади винятків
6
Класи винятків в С#
7
Генерація винятків і оператор throw
8 Створення користувацьких класів винятків
9 Контрольні запитання
10 Література та джерела
Обробка винятків. Блоки try, catch, finally
3. 3/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Постановка проблеми та її актуальність
Вимоги щодо
обробки збоїв в
програмі
Не допускати повного "розвалу" системи
Заносити всі випадки аномального
поведінки в журнал
Гарантувати відновлення системи до
стану, що був до виникнення збою
Надавати вичерпну інформацію про
помилку, необхідну для її діагностики
1
2
3
4
Не та програма працює коректно, яка зовсім не дає збоїв, а та, яка їх коректно обробляє і
дає вичерпну інформацію, необхідну для всебічної діагностики нештатної ситуації.
4. 4/50Ковалюк Т.В. Обробка виключних ситуацій на C#
1
2
3
4
Мета та завдання лекції
Набуття практичних
навичок щодо
обробки виняткових
ситуацій та
недопущення
логічних помилок в
програмі мовою
програмування C#
Мета: Завдання:
5. 5/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Виконання
некоректного
програмного
коду
Порушення
обмежень
середовища
виконання
програми
Збої
обладнання
Причини помилок в програмі
Некоректне
введення даних
6. 6/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Винятки (Exceptions) - це тип помилки, яка відбувається під час виконання програми.
Помилки зазвичай означають появу несподіваних проблем і можуть привести до
непередбаченого завершення програми.
Виняткові ситуації - це незвичайні неочікувані обставини, що виникають під час роботи
програми, це аномальна поведінка під час виконання програми, що перешкоджають
успішному виконанню конкретного завдання.
Винятки порушують нормальний хід роботи програми, і на них треба негайно
відреагувати
Поняття винятків
Винятки, обробка яких організована в коді, є очікуваними
7. 7/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Доступ до елементу поза
межами масиву
Спроба відкрити файл, якого не існує
Конвертація
некоректних даних з
одного типу в інший
Вичерпування пам'яті
програми
Арифметичні помилки:
ділення на нуль, корінь
з від’ємного числа…
Приклади помилок (винятків)
та багато інших
8. Ковалюк Т.В. Обробка виключних ситуацій на C# 8/50 8
Безпека програмного
забезпечення в процесі
виконання.
Призначення обробників винятків
C # може обробляти різні типи винятків за
допомогою механізму обробки винятків.
Забезпечення стабільності та
надійності роботи програми.
Обробка винятків - процес обробки
помилок часу виконання
Дружня поведінка закінченого
програмного продукту.
Обробка винятків вказує на дію, яку
необхідно виконати в разі виникнення
помилки, щоб запобігти примусовому
завершенню програми.
Зручність при написанні
програмного коду.
Винятки системного рівня викликаються
(викидаються) системою.
Винятки рівня додатків викликаються
самими додатками.
9. 9/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Підходи до обробки помилок
1. Повернення тільки
коду помилки з
методу
int errNum = firstMethod();
if (errNum == -1)
{
// обробка 1-ої помилки
}
else if (errNum == -2)
{
// обробка 2-ої помилки
}
2. Використання
значень типу, що
повертається з методу
if ((ans = root(value))) < 0)
{
// обробка помилки
}
else
{
// Продовження
обчислень
}
3. Вбудований в мову механізм
перевірки та обробки винятку
try
{ // бізнес-логіка за алгоритмом
}
catch(Exception1 e1)
{ // обробка 1-ої помилки
}
catch(ExceptionN eN)
{// обробка N-ої помилки
}
finally
{
// виконання дій, що завершують роботу
}
10. 10/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Переваги та недоліки обробки винятків
1. Винятки відокремлюють код
обробки помилок від
алгоритму програми, тим
самим підвищуючи
розбірливість, надійність і
розширюваність коду
2. Обробку помилок можна
централізувати в аспектах
(парадигма аспектно-
орієнтованого програмування)
3. Генерація виключення – це
єдиний чистий спосіб
повідомити про помилку з
конструктора
1. Винятки порушують структуру
коду, створюючи безліч прихованих
точок виходу, що ускладнює
читання і вивчення коду.
2. Винятки легко викликають витік
ресурсів, особливо в мові, що не
має вбудованого збирача сміття і
блоків finally в кінці.
3. Якщо виняток виникне в
деструкторі, то або компілятор
буде змушений видалити в
повному обсязі звільнений об'єкт,
або об'єкт залишиться існуючим,
тобто виникне витік пам'яті..
11. 11/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Переваги та недоліки обробки винятків
4. Винятки важко ігнорувати, на
відміну від кодів помилок.
5. Винятки легко передаються з
глибоко вкладених функцій.
6. Винятки можуть бути
обумовленими користувацькими
типами, що несуть більше
інформації, ніж код помилки
7. Об'єкти винятків зіставляються з
обробниками за допомогою
системи типів (класів).
8. Винятки можна створювати між
різними процесами і навіть
комп'ютерами.
9. Неприпустимі значення не
поширюються по системі на
відміну від обробки кодів помилок.
4. Винятки важко ввести в застарілий
код.
5. Реалізація механізму обробки
винятків істотно залежить від мови,
і навіть компілятори одної і той
самої мови можуть мати відмінності.
6. Важко передавати винятки між
частинами програми, написаними
на різних мовах.
7. Підтримка винятків ускладнює мову
і компілятор. Також вона знижує
швидкість роботи програми.
8. Виняток (потенційно) може
відбутися в будь-якому операторі і
аналізом самого коду неможливо
дізнатися, де саме виключення
можуть відбуватися.
12. 12/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Виняток викидається (throw), коли виникає виняткова ситуація.
Виняток перехоплюється в програмі (catch) і обробляється.
В іншому випадку виняток обробляється за замовчуванням.
Throw
Error
такі, що не
перевіряються
Exception
RuntimeException
такі, що не
перевіряються
Усі інші
такі, що
перевіряються
Error – фатальні помилки
RuntimeExcеption –
компілятор не вимагає їх
обов'язкової обробки
Exception – компілятор
перевіряє чи передбачена
обробка помилок
Механізм обробки винятків
13. 13/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Механізм обробки винятків
Потік обчислень відновлюється, причому виконується код
обробника виключення
Створюється і «викидається» об'єкт виключення, що містить
інформацію про помилку
Виконання поточного потоку обчислень призупиняється
Завершується виконання блоків і методів в ланцюжку
викликів аж до коду, що відловлює виняток
15. 15/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Носять передбачуваний характер
Вказуються в оголошенні методу
Успадковують від класу Exception
Зумовлені логікою коду
Не вказуються в оголошенні методу
Успадковують від класів
RuntimeException, Error
Класифікація виключень
16. 16/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Класифікація виключень
Синхронні
Безпосередній результат
виконання певної інструкції
Можуть бути оголошені і
неоголошені
Асинхронні
Не залежать від виконуваної
інструкції
Внутрішні помилки CLR
Результат роботи deprecated
методів
17. Ковалюк Т.В. Обробка виключних ситуацій на C# 17/50 17
Класи винятків
У мові програмування С# виняток – це об'єкт, створений при настанні певної виняткової
(помилкової) ситуації. Цей об'єкт містить інформацію, яка може допомогти відстежити
причину виникнення проблеми.
Найбільш загальний клас винятків, System.Exception, успадкований від System.Object.
Від System.Exception в ієрархії успадковується два важливих класи:
1. System. SystemException – цей клас передбачений для винятків, які зазвичай генерує
виконуюча система .NET, або ж які мають деяку загальну природу і можуть бути
згенеровані майже будь-яким додатком.
2. System.ApplicationException – цей клас є базовим для будь-якого класу винятків,
обумовлених незалежними розробниками. Якщо програміст визначає будь-яке
виключення, що обслуговують унікальні помилкові ситуації у своїх програмах, то він
повинен наслідувати їх – напряму або ж через посередників – від
System.ApplicationException.
19. 19/50Ковалюк Т.В. Обробка виключних ситуацій на C# 19
Виняток IndexOutOfRangeException виникає у випадках:
Неприпустимий індекс використовується для доступу до члена масиву
або колекції;
Спроба приcвоїти елемент масиву іншому масиву, який не має
достатнього розміру і має менше елементів, ніж вихідний масив
Використання значення, що повертається методом пошуку для ітерації
частини масиву або колекції, починаючи з певної позиції індексу.
Ієрархія винятків: Виняток IndexOutOfRangeException
Найбільш часті причини цієї помилки:
Забувають, що верхня межа колекції або масиву, який починається з нуля, є на одиницю
менше, ніж кількість елементів масиву або колекції
Виправлення помилки:
Замість перебору всіх елементів масиву за індексом можна використовувати оператор foreach
21. 21/50Ковалюк Т.В. Обробка виключних ситуацій на C# 21
using System;
using System.Collections.Generic;
public class Example
{
public static void Main()
{
List<Char> characters = new List<Char>();
characters.InsertRange(0, new Char[] { 'a', 'b', 'c', 'd', 'e', 'f' } );
for (int ctr = 0; ctr < characters.Count; ctr++)
Console.Write("'{0}' ", characters[ctr]);
}
}
// The example displays the following output:
// 'a' 'b' 'c' 'd' 'e' 'f'
Ієрархія винятків: Виняток IndexOutOfRangeException
Правильний
варіант коду
22. 22/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Ієрархія винятків: Виняток IndexOutOfRangeException
//7 елементів масиву
//6 елементів масиву
23. 23/50Ковалюк Т.В. Обробка виключних ситуацій на C# 23
Використання значення, що повертається методом пошуку для ітерації частини масиву або колекції, починаючи з певної
позиції індексу. Якщо ви забули перевірити, чи знайшла операція пошуку збіг, виконавча програма створює виняток
IndexOutOfRangeException. Щоб виправити цю помилку, перед перебором масиву перевірте значення, що повертається
методом пошуку
using System;
using System.Collections.Generic;
public class Example
{
static List<int> numbers = new List<int>();
public static void Main()
{
int startValue;
string[] args = Environment.GetCommandLineArgs();
if (args.Length < 2) startValue = 2;
else
if (! Int32.TryParse(args[1], out startValue))
startValue = 2;
ShowValues(startValue);
}
private static void ShowValues(int startValue)
{
// Create a collection with numeric values.
if (numbers.Count == 0)
numbers.AddRange( new int[] { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22} );
// Get the index of a startValue.
Console.WriteLine("Displaying values greater than or equal to {0}:",
startValue);
int startIndex = numbers.IndexOf(startValue);
// Display all numbers from startIndex on.
for (int ctr = startIndex; ctr < numbers.Count; ctr++)
Console.Write(" {0}", numbers[ctr]);
}
}
// The example displays the following output if the user supplies
// 7 as a command-line parameter:
// Displaying values greater than or equal to 7:
//
// Unhandled Exception: System.ArgumentOutOfRangeException:
// Index was out of range. Must be non-negative and less than the size of the collection.
// Parameter name: index
// at System.Collections.Generic.List`1.get_Item(Int32 index)
// at Example.ShowValues(Int32 startValue)
// at Example.Main()
Ієрархія винятків: Виняток IndexOutOfRangeException
24. 24/50Ковалюк Т.В. Обробка виключних ситуацій на C# 24
Виняток, який видається при спробі разименовання посилання на порожній
об'єкт. NullReferenceException виняток відображає помилку розробника і
виникає в наступних сценаріях:
Ієрархія винятків: Виняток NullReferenceException
Ви забули створити екземпляр посилального типу. Щоб усунути цю проблему, створіть екземпляр об'єкта,
щоб його значення було не null, викликавши конструктор класу
Ви забули визначити розмір масиву перед його ініціалізацією. Виняток можна усунути, оголосивши
кількість елементів в масиві перед його ініціалізацією.
Метод повертає значення null а потім викликається метод , що повертає тип. Щоб усунути цю проблему,
перевірте, яке значення методу повертається, щоб переконатися, що воно не є null перед викликом будь-
якого з його членів.
Використовується вираз для отримання значення і, незважаючи на те, що перевіряється, чи є значення null,
програма видає виключення NullReferenceException. Це відбувається тому, що одне з проміжних значень у
виразі повертає null. Цей виняток можна виправити, перевіривши значення тих властивостей, які можуть
набути значення null.
Виконується перерахування елементів масиву, що містять посилальні типи, і спроба обробити один з
елементів викликає виключення NullReferenceException. Виняток можна усунути, перевіривши, чи елемент
набуває значення null перед виконанням будь-якої операції з цим елементом.
26. 26/50Ковалюк Т.В. Обробка виключних ситуацій на C# 26
Ієрархія винятків: Виняток NullReferenceException
using System;
namespace NullReferenceException1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("NullReferenceException is absent");
int[] values = new int[5]; // int[] values = null
for (int ctr = 0; ctr < 5; ctr++)
values[ctr] = ctr * 2;
foreach (var val in values)
Console.WriteLine(val);
}
}
}
Правильний варіант
27. 27/50Ковалюк Т.В. Обробка виключних ситуацій на C# 27
Ієрархія винятків: Виняток AccessViolationException
Виняток, що виникає при спробі читання або запису в захищену область пам'яті
Виняток AccessViolationException може виникати тільки в небезпечному керованому коді або
при взаємодії керованого коду, що перевіряється, з некерованим кодом:
Порушення прав доступу, що виникає в ненадійному керованому коді, може бути виражено
як виняток NullReferenceException або AccessViolationException залежно від платформи.
Порушення прав доступу в некерованому коді, яке передається в керований код, завжди
упаковується в виняток AccessViolationException.
Знайти і виправити причину виключення AccessViolationException можна так:
Переконайтеся, що пам'ять, в яку здійснюється доступ, була виділена.
AccessViolationException виключення завжди створюється спробою доступу до захищеної
пам'яті, тобто для доступу до пам'яті, яка не є виділеної або не належить процесу.
Автоматичне управління пам'яттю - це одна з служб, які надаються середовищем CLR. Якщо
керований код надає ті самі функціональні можливості, що і некерований код, потрібно
перейти на керований код, щоб скористатися перевагами цієї функції.
28. 28/50Ковалюк Т.В. Обробка виключних ситуацій на C# 28
Ієрархія винятків: Виняток InvalidOperationException
Викликається, коли стан об'єкта не підтримує виклик методу. Наприклад, виключення
InvalidOperationException викликається такими методами, як:
IEnumerator.MoveNext, якщо об'єкти колекції змінюються після створення рахувальника.
ResourceSet.GetString, якщо набір ресурсів закритий до виклику методу.
XContainer.Add, якщо об'єкти, що ждодаються, призведуть до неправильного
структурованого XML-документу.
Метод, який намагається керувати призначеним для користувача інтерфейсом з потоку,
який не є основним потоком або потоком користувальницького інтерфейсу.
29. 29/50Ковалюк Т.В. Обробка виключних ситуацій на C# 29
Ієрархія винятків: Виняток ArgumentException
ArgumentException виникає при виклику методу, якщо принаймні один з переданих
аргументів не відповідає специфікації параметра методу, що викликається.
Найчастіше ArgumentException викликається середовищем CLR або іншою бібліотекою класів і
вказує на помилку розробника.
Класи ArgumentNullException і ArgumentOutOfRangeException є похіднми від класу
ArgumentException.
Ці похідні класи слід використовувати замість ArgumentException, за винятком випадків, коли
жоден з похідних класів не є прийнятним.
Виключення повинні створюватися таким чином:
ArgumentNullException, коли null передається в метод, який не приймає його в якості
допустимого аргументу.
ArgumentOutOfRangeException, якщо значення аргументу виходить за межі допустимих
значень.
Якщо у виклику методу немає аргументів або якщо помилка не торкається самі аргументи,
то слід використовувати InvalidOperationException.
30. Ковалюк Т.В. Обробка виключних ситуацій на C# 30/50
Зазвичай система сама генерує виключення за певних ситуаціях, наприклад, при діленні числа на
нуль. Але мова C# дозволяє генерувати виключення вручну за допомогою оператора throw.
Використовуючи оператор throw, програміст може створити виняток і викликати його в процесі
виконання.
Наприклад, в програмі відбувається введення рядка довжиною не більше 10 символів. Якщо
довжина рядка буде більша за 10 символів, виникає виняток:
Генерація винятку і оператор throw
Після оператора throw вказується об'єкт виключення, через конструктор якого можна передати
повідомлення про помилку.
Замість типу Exception можна використовувати об'єкт будь-якого іншого типу винятків.
32. 32/50Ковалюк Т.В. Обробка виключних ситуацій на C#
32
Загальні правила роботи з винятками
Кожний виняток має як формальну причину виникнення, так і
фактичну.
Виняток потрібно відловлювати і обробляти на тому рівні (по стеку,
порядку виклику методів), де його:
можна обробити;
має сенс обробляти.
Обробка винятків не зводиться до виведення тільки повідомлень
на консоль і запису в журнал (logger)!
Обробка винятків означає виконання таких дій, які
забезпечуватимуть надійний режим роботи програми без її
примусового переривання.
33. 33/50Ковалюк Т.В. Обробка виключних ситуацій на C#
33
Обробка виняткових ситуацій. Блок try-catch
Винятки в C # обробляються з використанням конструкції try-
catch.
Програмний код, виконання якого може призвести до
виникнення виняткових ситуацій або помилок слід поміщати в
блок try.
Блок catch призначений для самої обробки.
Обробка виняткової ситуації зазвичай містить інструкції для
запису повідомлення про помилку в журнал помилок програми.
Цей процес може також супроводжуватися виведенням
повідомлення про помилку на екран.
Потім записують дії, що усувають наслідки виняткової ситуації
або ж виняток збуджується знову, щоб бути обробленим на
іншому архітектурному рівні програми.
Слід враховувати, що виняткові ситуації, які виникають в ході
виконання коду блоку catch, вже не перехоплюються поточним
оператором try-catch, тому в блоці catch потрібно намагатися
розміщувати "безпечний" код.
34. 34/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Блок try
try
{
Інструкції
}
catch (Тип_винятку1 ідентифікатор_1)
{
Інструкції
}
catch (Тип_винятку2 ідентифікатор_2)
{
Інструкції
}
…..
Блок try містить в собі код, що виконується успішно при
нормальних обставинах
Тіло блоку try виконується до:
Моменту виникнення виняткової ситуації
Благополучного досягнення кінця блоку
Конкретний блок в процесі виконання може викинути
тільки один виняток
35. 35/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Блок catch
try
{
Інструкції
}
catch (Тип_винятку1 ідентифікатор_1)
{
Інструкції
}
catch (Тип_винятку2 ідентифікатор_2)
{
Інструкції
}
…..
Блок catch - це метод з параметром типу виняток, який
їм обробляється
Блок catch здатний:
Виконати деякі відновлювальні дії.
Викинути власний виняток.
Здійснити необхідні дії і передати управління
подальшим інструкціям.
Кількість блоків catch не регламентована.
Блоки catch розглядаються послідовно до
виявлення серед них того, тип якого допускає
присвоєння викинутого винятку.
Не слід використовувати широкий тип винятку,
наприклад, Exception в якості перехоплюваног.
Список блоків catch переглядається тільки один
раз!
36. 36/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Блок finally
Блок finally виконується в будь-якому випадку:
При успішному виконанні try.
При викиданні виключення.
При передачі управління з break або return!
Блок finally необов'язковий.
Якщо є finally, блоки catch необов'язкові.
Якщо присутній finally, то виконується після
завершення роботи інших фрагментів коду try.
Часто блок finally опускається, коли обробка
виключення має на увазі нормальне подальше
виконання програми - тому блок finally може бути
просто замінений звичайним кодом, який слідує за
блоками try і catch.
try
{
/* код, який може кинути виняток */
}
catch (Exception)
{
/* обробник винятку */
}
finally
{
/* Код, який буде виконаний, незалежно
від того, був викинутий/ перехоплений
виняток, чи ні */
}
37. 37/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Блок-схеми
обробки
винятку
try-catch
try-catch-finally
38. Ковалюк Т.В. Обробка виключних ситуацій на C# 38/50
Стек винятків. Пошук блоку catch при обробці винятків
Якщо код, який викидає виняток, не розміщується в блоці try, або знаходиться в конструкції
try..catch, що не містить відповідного блоку catch для обробки винятку, то система здійнює
пошук відповідного обробника в стеку викликів.
Початок
Main()
Method1()
Method2()
DivideByZeroException
Кінець
Приклад
структури
програми
Результат виконання програмиСтек виклику
функцій
Main()
Method1()
Method2()
39. 39/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Приклад стеку винятків
using System;
namespace stackException
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Example Stack Exception - tracing activities");
try
{
Console.WriteLine("try in Main");
TestClass.Method1();
}
catch (DivideByZeroException ex)
{
Console.WriteLine($"Catch в Main : {ex.Message}");
}
finally
{
Console.WriteLine("Блок finally в Main");
}
Console.WriteLine("End of Main");
Console.Read();
} //end of Main()
} //end of class Program
} //end of namespace stackException
40. 40/50Ковалюк Т.В. Обробка виключних ситуацій на C#
using System;
namespace stackException
{
class TestClass
{
/// метод Method1 викликає Method2, який генерує виняток
public static void Method1()
{
try
{
Console.WriteLine("try in Method1");
Method2();
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine($"Catch в Method1:{ex.Message}");
}
finally
{
Console.WriteLine("Блок finally в Method1");
}
Console.WriteLine("Кiнець методу Method1");
} //end of Method1()
/// метод, що генерує виняток DivideByZeroException
static void Method2()
{
try
{
Console.WriteLine("try in Method2");
int x = 8;
int y = x / 0; //виняток – ділення на нуль
}
finally
{
Console.WriteLine("Блок finally в Method2");
}
Console.WriteLine("Кiнець методу Method2");
} // end of Method2()
} // end class TestClass
} // end of namespace
Приклад стеку винятків
41. 41/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Оператор throw без параметрів
Зазвичай система сама генерує виключення за певних ситуаціях, наприклад, при діленні числа на
нуль. Але мова C # також дозволяє генерувати виключення вручну за допомогою оператора throw.
Після оператора throw вказується об'єкт виключення, через конструктор якого можна передати
повідомлення про помилку.
Але існує інша форма використання оператора throw, коли після цього оператора не
вказується об'єкт виключення.
У подібному вигляді оператор throw може використовуватися тільки в блоці catch і
означає, що виняток буде переданий зовнішньому блоку catch.
42. Ковалюк Т.В. Обробка виключних ситуацій на C# 42/50 42
Створення користувацьких класів винятків
Можна створити свої типи
винятків. Базовим класом для
всіх винятків є клас Exception,
відповідно для створення
своїх типів програміст може
успадкувати даний клас.
Нехай в програмі буде
обмеження за віком особи
(наприклад, участь у виборах):
using System;
namespace userexcept
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("User exception example.");
try
{
Person p = new Person { accessName = "Ivan", accessAge = 17 };
}
catch (PersonException ex)
{
Console.WriteLine($"Помилка: {ex.Message}");
Console.WriteLine($"Некоректне значення: {ex.Value}");
}
Console.Read();
}
}
}
43. 43/50Ковалюк Т.В. Обробка виключних ситуацій на C# 43
Створення користувацьких класів винятків
У класі Person при
установці віку відбувається
перевірка, і якщо вік
менше 18, то викидається
виключення.
namespace userexcept {
class Person
{
private int age;
private string Name;
public string accessName { get; set; }
public int accessAge {
get { return age; }
set {
if (value < 18) {
throw new PersonException("Особам до 18 реєстрацiя заборонена",value);
}
else {
age = value;
}
}
}
}
}
44. 44/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Створення користувацьких класів винятків
Іноді зручніше використовувати свої класи
виключень. Наприклад, ми хочемо обробити тільки
ті винятки, які відносяться до класу Person. Для цих
цілей ми можемо зробити спеціальний клас
PersonException:
using System;
namespace userexcept
{
class PersonException : ArgumentException
{
public int Value { get; }
public PersonException(string message, int val)
: base(message )
{
Value = val;
}
}
}
У конструкторі класу PersonException звертаємося
до конструктора базового класу
ArgumentException, передаючи в нього рядок
message і значення, яке хочемо зберігати. Клас
Person викидатиме виключення саме цього типу і
відповідно в основній програмі оброблятиметься
цей виняток.
Клас ArgumentException представляє виняток, що
генерується в результаті передачі аргументу методу
некоректного значення.
45. 45/50Ковалюк Т.В. Обробка виключних ситуацій на C#
Щоб код класу призначеного для користувача виключення відповідав рекомендаціям .NET,
потрібно дотримуватися наступних правил:
клас виключення повинен успадковуватися від Exception / ApplicationException;
клас повинен бути позначений атрибутом [System.Serializable];
клас повинен визначати стандартний конструктор;
клас повинен визначати конструктор, який встановлює значення успадкованої властивості
Message;
клас повинен визначати конструктор для обробки "внутрішніх винятків";
клас повинен визначати конструктор для підтримки серіалізації типу.
Як правильно створювати користувацькі виключення в C #
46. Ковалюк Т.В. Обробка виключних ситуацій на C# 46/50 46
Чого слід уникати при виклику винятків
1. Винятки не рекомендується використовувати для зміни потоку програми в рамках
звичайного виконання. Винятки слід використовувати тільки для повідомлення про стани
помилки та їх обробки.
2. Винятки повинні генеруватися, а не повертатися в якості значення, що повертається або
параметра.
3. Не слід викликати System.Exception, System.SystemException,
System.NullReferenceException або System.IndexOutOfRangeException з власного вихідного
коду навмисно.
4. Не рекомендується створювати винятки, які можуть викликатися в режимі налагодження, а
не в режимі виконання. Щоб визначити помилки часу виконання на етапі розробки,
використовуйте Debug Assert.
47. Ковалюк Т.В. Обробка виключних ситуацій на C# 47/50 47
1. На кожному архітектурному рівні намагайтеся обробляти тільки "свої" винятки, а обробку
інших залишайте більш компетентним обробникам інших рівнів вашої програми.
2. Намагайтеся в розумних межах використовувати свої власні класи винятків з тим, щоб
передавати специфічні для кожної окремої ситуації дані, необхідні для повної діагностики
помилок.
3. Також, використовуйте свої класи винятків для того щоб приховати від користувачів ваших
програмних компонентів деталі їх реалізації. У деяких ситуаціях це може бути вкрай
корисним, оскільки ваші творіння можуть потрапити і в руки конкурентів.
4. Намагайтеся завжди використовувати винятки для обробки позаштатних ситуацій крім, хіба
що, тих випадків, коли ви серйозно обмежені в обсягах використовуваної оперативної
пам'яті. В умовах подібних обмежень можна звернутися до старих добрих цілочисельних
кодів помилок.
5. Використовуйте винятки за призначенням.
Рекомендації з використання винятків
48. Ковалюк Т.В. Обробка виключних ситуацій на C# 48/50 48
Контрольні запитання
Що буде, якщо виняток згенерований у
блоці finally?
Конструктор не виконається до кінця і об’єкт
буде не доініціалізований
Що буде, якщо виняток згенерований в
статичному конструкторі?
Обробник винятку не буде знайдений і робота
програми буде перервана
Що буде, якщо виняток
використовується оператор throw без
параметрів?
Управління буде передане на рівень вище того,
де записаний throw
Компілятор буде змушений видалити в повному
обсязі звільнений об'єкт, або об'єкт залишиться
існуючим, тобто виникне витік пам'яті.
Що буде, якщо виняток згенерований в
дестукторі?
49. Ковалюк Т.В. Обробка виключних ситуацій на C# 49/50 49
Література та джерела
1. Обработка и создание исключений в .NET. Режим доступу: https://docs.microsoft.com/ru-
ru/dotnet/standard/exceptions/
2. Полное руководство по языку программирования С# 8.0 и платформе .NET Core 3. Режим доступу:
https://metanit.com/sharp/tutorial/
3. Курс программирования C# Quick Guide. Режим доступу
http://codingcraft.ru/c_sharp_coding/tutorial.php#contents
4. Парфьонов Ю. Е. Федорченко В. М. Лосєв М. Ю. Щербаков О. В. ОБ’ЄКТНО-ОРІЄНТОВАНЕ ПРОГРАМУВАННЯ. –
Харків : Вид. ХНЕУ, 2010. – 312 с. Режим доступу:
http://www.repository.hneu.edu.ua/bitstream/123456789/2750/1/%D0%9E%D0%B1%E2%80%99%D1%94%D0%BA%
D1%82%D0%BD%D0%BE-
%D0%BE%D1%80%D1%96%D1%94%D0%BD%D1%82%D0%BE%D0%B2%D0%B0%D0%BD%D0%B5%20%D0%BF%D1%8
0%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F.%20%D0%9A%D0%
BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82%20%D0%BB%D0%B5%D0%BA%D1%86%D1%96%D0%B9.%20
%D0%A9%D0%B5%D1%80%D0%B1%D0%B0%D0%BA%D0%BE%D0%B2%20%D0%9E.%20%D0%92..pdf
5. Обработка исключений. Режим доступу:
https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%B
8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B9
6. Создание пользовательских исключений с локализованными сообщениями об исключениях.
https://docs.microsoft.com/ru-ru/dotnet/standard/exceptions/how-to-create-localized-exception-messages
50. Ковалюк Т.В. Обробка виключних ситуацій на C# 50/50 50
IndexOutOfRangeException Класс
https://docs.microsoft.com/ru-ru/dotnet/api/system.indexoutofrangeexception?view=netcore-3.1
https://docs.microsoft.com/ru-ru/dotnet/api/system.nullreferenceexception?view=netcore-3.1
https://metanit.com/sharp/tutorial/2.30.php
51. Ковалюк Т.В. Обробка виключних ситуацій на C# 51/50
Дякую за увагу
Т.В. Ковалюк, к.т.н.,доцент
tkovalyuk@ukr.net
Editor's Notes
The objective of the paper is to summarize the issues of cluster purpose structures formation in the educational field. The study of the problem of cluster model development for IT education in Ukraine is necessary to define the conceptual bases for the creation of scientific-industrial-educational clusters to improve the efficiency and quality of training of IT specialists and ensure transition of Ukrainian IT education to the innovative development path.
The digital economy poses new challenges for the education system.
To train specialists who meet the requirements of the digital economy development, the technological and information transformation of the university is necessary, which ensures the transition to smart education.
Several principles of smart education: creation of motivating educational environment ; development of educational content that is being updated in real time; innovative educational technologies ; Individual educational trajectory; students and teachers interaction with the professional community.