Винятки корисні при різних обставинах.
По-перше, є деякі функції, де вартість обчислення попередньої умови настільки висока, що краще просто зробити обчислення та перервати за винятком, якщо встановлено, що попередня умова не виконується. Наприклад, ви не можете інвертувати одиничну матрицю, однак для обчислення, якщо вона є одиничною, ви обчислюєте детермінант, який є дуже дорогим: можливо, це все одно доведеться зробити всередині функції, тому просто "спробуйте" при інвертуванні матриці та подайте звіт помилка, якщо ви не можете, викинувши виняток. В основному це виняток як негативне використання попередньої умови .
Тоді є й інші випадки, коли ваш код вже є складним, а передача інформації про помилку по ланцюжку дзвінків утруднена. Це частково тому, що C і C ++ мають непрацездатні моделі структури даних: існують інші, кращі способи, але C ++ їх не підтримує (наприклад, використання монад у Haskell). Це використання, в основному, мені не заважало робити це правильно, тому я викину виняток : це не правильний шлях, але це практично.
Тоді є основне використання винятків: повідомляти про те, коли зовнішні попередні умови або інваріанти, такі як достатня кількість ресурсів, таких як пам’ять або дисковий простір, недоступні. У цьому випадку ви, як правило, припиняєте програму або її основний підрозділ, і винятком є хороший спосіб передачі інформації про проблему. Винятки C ++ були розроблені для повідомлення про помилки, які перешкоджають продовженню програми .
Відомо, що модель обробки винятків, що використовується в більшості сучасних мов, включаючи C ++, не працює . Це надзвичайно потужний. Теоретики зараз розробили кращі моделі, ніж повністю відкрита модель "кидай що-небудь" і "можливо, а може, не зловити". Крім того, використання інформації про тип для класифікації винятків було не дуже вдалою ідеєю.
Тож найкраще, що ви можете зробити, це економно кидати винятки, коли існує фактична помилка, і коли немає іншого способу впоратися з нею та вловити винятки якомога ближче до точки кидка .