SLC S22 Week4 Exception handling in Java

in Ukraine on Steem17 days ago

image.png

Завдання 1 Виявлення помилкових показань датчика

Постановка проблеми
Вам доручено керувати даними про температуру, зібраними з кількох датчиків на заводі. Датчик може надсилати недійсні дані (наприклад, негативні температури для датчика, призначеного для вимірювання температури вище нуля). Напишіть програму для обробки списку показань температури та обробки винятків для будь-яких недійсних значень.

Приклад Пояснення
Якщо датчик надає показання [23, -5, 18, 30], ваша програма має пропустити недійсне значення -5, зареєструвати помилку та продовжити обробку інших показань. Переконайтеся, що програма не припиняє обробку всіх датчиків через одне неправильне зчитування.

Коли довго програмуєш код пишеться в голові сам))) принаймні на прості задачі.
І на це завдання у мене в голові виник код
image.png
І без всякого try/catch - таку просту задачу можна зробити і без try/catch. Проте саме на такому простому завданні і слід вчити використання try/catch.

image.png

Я уточнив задачу ніби дані поступають з датчика щогодини, програма фіксує кількість некоректних і знаходить середнє арифметичне дійсних значень.

Часто в таких задачах виникає питання використовувати масив чи ні - то я відповідаю так. Якщо дані треба один раз, тобто отримали врахували і більше вони не потрібні - то для чого масив. а якщо ми будемо повторно звертатися до цих даних(не один раз) то їх слід зберігати в масиві.

Завдання2. Перевірка динамічного введення для події

Постановка проблеми
Онлайн-реєстраційна форма приймає вік учасників для заходу. Вік має бути від 18 до 60 років. Напишіть програму, яка перевіряє вхідні дані та викидає спеціальний виняток InvalidAgeExceptionдля віку, що виходить за межі діапазону. Ваша програма має перехопити виняток і вивести повідомлення з поясненням причини недійсності введення.

Приклад Пояснення
Якщо користувач вводить 16, програма має повідомити його: «Вік має бути від 18 до 60 років. Ви ввели: 16». Система має запитати введення знову без збоїв.

Тут ми створюємо цикл який буде аналізувати змінну що відповідатиме за коректність вводу. Значення цієї змінної буде встановлене в true як тільки будуть коректно введені дані.
image.png

Та навіть і це завдання не переконує мене у необхідності/доцільності використовувати try/catch
Адже можна обійтися і без цього
image.png

Звісно що на такому простому прикладі слід навчитися користуватися новими командами try/catch і може здатися логічним для чого винаходити щось нове якщо і старе працює)))

Завдання3. Ієрархічна обробка винятків у грі

Постановка проблеми

Ви розробляєте просту RPG (рольову гру). Гравці можуть зіткнутися з різними помилками, такими як недостатня кількість очок здоров’я, недійсні ходи або відсутність предметів інвентарю. Створіть ієрархію спеціальних винятків (наприклад, HealthException, MoveException, InventoryException) і напишіть програму для їх обробки на відповідних рівнях, залежно від контексту.

Приклад Пояснення
Здоров'я гравця падає нижче нуля через недійсний хід. Має MoveException обробити недійсний хід і HealthException сповістити про те, що у гравця вичерпано очок здоров’я. Переконайтеся, що винятки обробляються незалежно для кращої стабільності гри.

image.png
На базі стандартного Exception я створив головний GameException, а від них Health-, Move-, Command-, Inventory Exception.
В них поки що додано примітивну реалізацію.

В клас Inventory я зробив можливість додавати різні предмети
image.png

Головна програма складається з нескінченного циклу який вводить команди і реагує на них(виконує)
image.png

Клас Payer - клас головного героя, який має атрибути(поля) ім'я, здоров'я, максимальний рівень здоров'я(для відновлення) та інвентар(предмети)
xxxxxx.gif

Кожна дія віднімає 1% здоров'я, можливо краще було б зробити що результативна дія віднімає(а помилка ні)
Доступні дії left, right, jump, add [item], use [item] Можна додати предмет і використати його. Є один предмет - med що лікує героя, але його треба знайти та додати. Стрибок віднімає більше здоров'я ніж звичайна дія.

dr2.gif

Завдання4. Помилки транзакцій банківської системи

Постановка проблеми
У банківській системі користувачі можуть переказувати гроші між рахунками. Створіть програму, яка перевіряє транзакції, обробляючи винятки, такі як InsufficientFundsException, InvalidAccountException і NegativeTransferException. Переконайтеся, що програма забезпечує детальний зворотний зв’язок з користувачем і реєструє помилки для невдалих транзакцій.

Приклад Пояснення
Якщо користувач намагається здійснити переказ -100, програма має перехопити NegativeTransferException та повідомити користувача: «Сума переказу має бути додатною. Ви ввели: -100». Для недійсного облікового запису відобразіть: «Обліковий запис не знайдено. Перевірте деталі».

GI555F.gif

В коді реалізовано на базі стандартного винятку Exception три винятки для недостатності коштів, не вірного рахунку та від'ємної суми транзакції.

Банківський запис складається з номера рахунку та балансу.
при спробі здійснення транзакції ми перевіряємо чи існують рахунки відправника та отримувача і чи є наявна сума на балансі.

Завдання 5. Автоматизація очищення ресурсів

Постановка проблеми
Напишіть програму, яка відкриває кілька файлів, читає їхній вміст і закриває їх належним чином, навіть якщо під час процесу читання виникає виняткова ситуація. Використовуйте finally блок або будь-який інший механізм, щоб забезпечити очищення ресурсу.

Приклад Пояснення
Якщо файл з іменем data.txtвідсутній, програма повинна зареєструвати: «Файл не знайдено: data.txt». Незалежно від помилки, програма має переконатися, що всі відкриті файли закриті перед завершенням роботи. Наприклад, для успішно оброблених файлів має відображатися «Закритий файл: config.txt».

image.png

Ключова особливість цього завдання - демонстрація finally. finally спрацює після вдалого чи невдалого кінця роботи try/catch. Тут перевіяємо чи відкритий файл і закриваємо його.

Завдання6. Прогнозування майбутніх помилок за допомогою журналів

Постановка проблеми
Розробіть програму, яка обробляє журнали активності користувачів для веб-сайту електронної комерції. Якщо користувач намагається увійти з неправильними обліковими даними більше ніж 3 рази поспіль, введіть SuspiciousActivityException. Переконайтеся, що програма записує дії для подальшого аналізу та сповіщає адміністратора.

Приклад Пояснення
Якщо користувач спробує ввійти за допомогою паролів abc123, password!, і welcome поспіль безуспішно, система повинна викликати сповіщення: «Виявлено підозрілу активність користувача: kouba01». Адміністратори повинні мати можливість переглядати ці деталі, не припиняючи службу.

image.png
Головна програма - запитує в користувача логін та пароль і перевіряє їх.

Виняток SuspiciousActivityException наслідує базовий виняток
image.png

Вся основна робота програми здійснюється в класі ActivityLogger, де конструктор створює три масиви: активності, та два масиви з логінами/паролями.
zz6666.gif

Далі при спробі залогінитися attemptLogin - ця спроба пишеться в масив/протокол
Далі якщо входить адмін то виводимо лог входів вдалих та невдалих
А далі перевіряємо чи вірний логін та чи не було три невдалих спроби залогінитися.

passttt.gif


На перший погляд, особливо для тих хто спочатку вчив процедурне програмування, може здатися що і без винятків можна обійтися. І більшість(а то й майже всі) ці завдання можна було б зробити і без винятків. На функціях, з поверненням різних кодів помилок та їх комбінацій. Але коли таких функцій багато, і одна з них викликає іншу, аварійно завершуючись та повертаючи коди помилок - стає дуже важко розібратися в цій ієрархії викликів. І саме тут знадобиться catch(). Звісно тут як і в багатьох нових інструментах необхідно багато практики....)))

Sort:  
Loading...
Loading...