Kotlin: try-catch-finally блок та що таке Exception ☄️ (основи програмування)
Весь матеріал ви можете знайти переглянувши відео, але стислий конспект я залишу і тут.
Kotlin: try-catch-finally блок
Дуже часто в програмуванні стається таке, що потрібно перевести дані з одного формату в другий, наприклад, з String в Int або навпаки. Це нормально, особливо в клієнт-серверний застосунках. До прикладу команда, яка розробляє Backend може зберігати певні дані в одному виді, що зовсім не правильно буде на mobile напрямку. В таких моментах виникає гостра потреба мапити (eng. mapping / to map, але не плутайте з Map з теми колекцій) дані з одного формата в другий.
Just in fact:
В Kotlin-і у нас є функії ковертації з любого базового типа в любий, наприклад:
- String to Int
var number = “1”
number.toInt() - Int to String
var number = 1
number.toString() - Float to Short
var number = 15.45f
number.toShort() (в таких випадках значення округляється) - і так далі: int.toFloat(), float.toDouble(), char.ToString()…
Власне ось:
Не виключено, що при конвертації відбудеться якась помилка через те, що програміст не уважний або просто не знає чогось, що важливо 🥴
Наприклад, як ви думаєте, що буде, якщо пустий String спробувати конвертнути в Int, наприклад? 🤔
— правильно, станеться помилка.
Це власне тільки один із прикладів того, що може статись через необачність програміста.
А що таке помилка, які вони є і як з ними поводитись ми розберемо в наступному пості 🤝 so stay tuned ✨
Давайте подивимось на ось такий випадок:
- У нас є масив даних (який ми можемо змінювати, just friendly reminder).
- Ми маємо записані числа всередині як String, except 3rd element of course.
- Далі ми намагаємо конвертувати String в Int.
- В такому випадку відбудеться помилка, тому що пустота не може стати Integer-ом, що доситься логічно.
👹 Після виконання такого коду, буде ось така помилка:
Як з таким жити і що робити? Відповідь ⤵️
Try-catch-finally block
В таких ситуаціях, як ви могли вже здогадатись, нам на допомогу приходить try-catch блок, який чудово справляється з помилками.
Let me explain:
Try-catch-finally block — це така спеціальна конструкція в мовах програмування, що призначеня для “відлову помилком” і реагування на них. У всіх мова воно працює однаково, максимум можуть бути якісь мінімальні технічні відмінності, але суть одна єдина для всіх.
🖼 Має воно наступний вигляд:
🥚 Try {…}
Всередині блоку try{…} ми пишемо код, в якому очікуємо, що може відбутись якась помилка (але може і не відбутись!)
Відносно одної назви — ми намагаємось, we try {…}
🐣 Catch (ex: Exception) {…}
Ця частина конструкції try-catch призначена для того, щоб зробити щось, у випадку, якщо все ж таки помилка станеться.
Власне цей блок catch гарантує нам, що якось станеться помилка, то програма не “впаде” і не перестане працювати! (Але тільки якщо ми вказали правильну помилку! — про це трохи згодом 😏)
Зверніть увагу, що в рамках скоупа catch у нас є “ex: Exception” — це власне і буде помилка, яка станеться (якщо станеться).
Знову ж таки, нагадую, про помилки ми поговоримо в наступному уроці/пості/туторіалі.
🐥 Finally {…}
And finally, остання частина цієї констукції — це блок finally. Його суть проста: він викликається завжди, але в самому кінці після всіх ваших try-catch. Він накшталт телеведущого, який прощається з глядачами в самому кінці. Його не цікавить, що ви там наробили, як ви з цього викручувались і так далі. Він просто в кінці зробит те, що ви йому скажете. Все.
☝🏻 Але, зверніть увагу, що він не є обов’язковим, тобто його можна не писати, якщо він вам не треба. В такому випадку нічого не буде викликатись, оскільки ви його просто не написали (що досить логічно).
To be or not to be © Catch
🎯 No catch block
Також при роботі з try-catch-finally ми можемо по різному комбінувати наші блоки.
Ось наступні комбінації:
- single try ❌
- single catch ❌
- single finally ❌
- try + catch ✅
- try + catch + finally ✅
- try + finally ✅
- catch + finally ❌
Звертаю вашу увагу на те, що ми можемо упустити catch block і просто використати try {…} finally {…}.
Це може бути дивним на перший погляд, оскільки сенс try-catch-finally в тому, щоб відловити помилку — і тут я з вами погоджуюсь.
Але є ситуації, коли нам треба кинути/показати/відтворити помилку — ці випадки не на стільки часті, але все ж таки…
Просто знайте, що там тоже можна зробити ☝🏻
🎯 multiple catch block
Забігаючи трохи на перед скажу, що помилки є різні:
- не добре зконвертоване значення
- не знайдений файл
- відсутність інтернета
- арифметичні помилки
- помилки з індексам і так далі.
🧑🏻🏫 Давайте представимо, що у вас є завдання наступного характеру — вам потрібно знайти і відкрити файл, записати в нього щось, зберігти, закрити і вийти звідти.
На перший погляд нічого важкого або страшного тут немає, але є багато підводних каменів 🪨
Що, на думку початківця, може статись під час виконання такого завдання:
— та по-суті нічого, easy-breasy, відкрив, записав, закрив.
максимум для підстаховки обгорне в try-catch для того, щоб уж точно все було ок (а то мало лі?) 😏
Що, на думку досвідченного програміста може статись:
— файл може не бути знайденим (FileNotFoundException)
— файл може бути invisible (щеЯкасьТамException)
— при створені нового може бути дублікат (FileAlreadyExistsException)
— помилка при записі даних (IOException)
— помилка при відкритті/збереженні (AccessDeniedException)
— і так далі
Якщо вам потрібно мати різні поведінки для різних випадків, наприклад, щоб дати користувачу зрозуміти, що пішло не так, то декілька catch блоків — ваша вихід із ситуації.
Якщо що, то це абсолютно нормально. Просто в більшості варіантів люди просто використовують 1 catch блок з глобальним Exception і все.
Але, якщо у станеться такий випадок, то тепер ви будете знати, що робити 😎
На цьому поки у мене все, дякую за увагу 👏🏻
Буду дуже вдячний, якщо поширите мій патріон у ваших соціальних мережах. Найкраща реклама — це ваші відруги 🫶🏻
Всім миру 🕊
🎬 Ось мій канал, де будуть всі відео на різні теми в програмуванні:
📚 Ось мій Patreon, де будуть всі матеріали в текстовому форматі, додаткова інфа, розбір приклдів, домашні завдання, ІТ-словник, і тд:
Окрім цього, там є різні пропозиції, наприклад, можемо займатись 1х1, можу допомогти зробити резюме, проведу співбесіду і так далі.
🎬 Весь контент, який я роблю — це все мій особистий досвід.
Я пишу/знімаю все сам і ділюсь з вами корисною інформацією, яку ніхто не розповідає, тому підтримайте підпискою ❤️
🙂 На цьому у мене — все!
👉🏻 Ставте лексуси, підписуйтесь і будьте умнічками.
Якщо я правий — похваліть, якщо ні — посваріть.
Но в любому випадку не забудьте дати фідбек 😉
Успіхів! 🇺🇦🦄