На мою думку, винятки є важливим інструментом виявлення помилок коду під час виконання. Як у випробуваннях, так і у виробництві. Зробіть їх повідомлення досить багатослівним, щоб в поєднанні зі слідом стека ви могли зрозуміти, що сталося з журналу.
Винятки - це здебільшого інструмент розробки та спосіб отримати розумні повідомлення про помилки від виробництва у несподіваних випадках.
Окрім того, що розділення проблем (щасливий шлях із лише очікуваними помилками та проникненням до досягнення якогось загального обробника для несподіваних помилок) є хорошою справою, зробивши ваш код більш читабельним та доступним для обслуговування, насправді неможливо підготувати код до всього можливого несподівані випадки, навіть роздуваючи його з кодом обробки помилок до повної нечитабельності.
Це власне значення "несподіваного".
Btw., Що очікується, а що ні - це рішення, яке можна прийняти лише на сайті виклику. Ось чому перевірені винятки в Java не вийшли - рішення приймається в момент розробки API, коли зовсім не ясно, що очікується чи несподівано.
Простий приклад: API хеш-карти може мати два способи:
Value get(Key)
і
Option<Value> getOption(key)
перший кидає виняток, якщо його не знайдено, останнє дає необов'язкове значення. В деяких випадках останній має більше сенсу, але в інших ваш код повинен сподіватися, що для даного ключа буде значення, тому якщо його немає, це помилка, яку цей код не може виправити, оскільки базовий припущення не вдалося. У цьому випадку насправді потрібна поведінка, щоб випасти з кодового шляху і перейти до якогось загального обробника, якщо виклик не вдасться.
Кодекс ніколи не повинен намагатися боротися з невдалими базовими припущеннями.
За винятком перевірки їх та викидання добре зрозумілих винятків, звичайно.
Кидати винятки не є злом, але зловити їх можливо. Не намагайтеся виправити несподівані помилки. Ловіть винятки в кількох місцях, де ви хочете продовжити цикл чи операцію, запишіть їх, можливо, повідомте про невідому помилку, і все.
Лові блоки всюди - дуже погана ідея.
Створіть свої API таким чином, щоб полегшити висловлення свого наміру, тобто заявити, чи очікуєте ви певного випадку, наприклад ключ не знайдений, чи ні. Потім користувачі вашого API можуть вибирати виклик, що викидає, лише для справді несподіваних випадків.
Я здогадуюсь, що причина того, що люди обурюються винятками і заходять занадто далеко, опускаючи цей вирішальний інструмент для автоматизації роботи з помилками та кращого відокремлення проблем від нових мов, - це поганий досвід.
Це та деякі непорозуміння щодо того, для чого вони насправді хороші.
Моделювання їх, виконуючи ВСЕ за допомогою монадичного прив’язки, робить ваш код менш читабельним та зручним для обслуговування, і ви закінчуєтесь без сліду стека, що робить цей підхід НАЙКУЩО гіршим.
Функціональна помилка обробки помилок чудово підходить для очікуваних випадків помилок.
Нехай обробка виключень автоматично береться за всі інші, ось для чого це :)
panic
що не зовсім те саме. Крім того, що там сказано, виняток - це не набагато більше, ніж складний (але комфортний) спосіб виконанняGOTO
, хоча з очевидних причин цього ніхто не називає.