Існує багато вимог, необхідних для належної системи передачі та обробки винятків. Існує також багато варіантів для вибору мови для реалізації концепції.
Вимоги до винятків (не в конкретному порядку):
Документація . Мова повинна містити значення для документування винятків, які API може викидати. В ідеалі цей носій документації повинен бути машинопридатним, щоб дозволити компіляторам та IDE надавати підтримку програмісту.
Передача виняткових ситуацій . Ця ситуація очевидна, щоб дозволити функції передавати ситуації, які заважають функціонуванню, що викликається, виконувати очікувану дію. На мою думку, існує три великі категорії таких ситуацій:
2.1 Помилки в коді, які спричиняють недійсність деяких даних.
2.2 Проблеми з конфігурацією або іншими зовнішніми ресурсами.
2.3 Ресурси, які по суті є ненадійними (мережа, файлові системи, бази даних, кінцеві користувачі тощо). Це трохи важливий випадок, оскільки їх ненадійний характер повинен сподіватись на їх спорадичні невдачі. Чи слід вважати ці ситуації винятковими?
Надайте достатньо інформації для коду, щоб обробити його : винятки повинні надати достатню інформацію для виклику, щоб він міг реагувати та, можливо, вирішувати ситуацію. інформації також повинно бути достатньо для того, щоб при вході в систему ці винятки забезпечували програмісту достатній контекст для ідентифікації та ізоляції заяв про порушення та надання рішення.
Надайте впевненість програмісту щодо поточного стану виконання його коду : Виключення можливостей управління програмною системою повинно бути достатньо, щоб забезпечити необхідні гарантії, залишаючись поза дорогою програміста, щоб він міг бути зосередженим на задачі на рукою.
Для висвітлення цих методів на різних мовах були реалізовані наступні методи:
Перевірені винятки Надайте чудовий спосіб документувати винятки, і теоретично при правильному застосуванні слід забезпечити достатньо впевненості, що все добре. Однак вартість така, що багато хто вважає більш продуктивним просто обійти викидання винятків або перекинути їх як неперевірені винятки. При використанні неправильно перевірених винятків в значній мірі втрачається вся корисність. Також перевірені винятки ускладнюють створення стабільного за часом API. Впровадження загальної системи в конкретному домені призведе до навантаження виняткової ситуації, яку важко буде підтримувати, використовуючи виключно перевірені винятки.
Неперевірені винятки - набагато більш універсальні, ніж перевірені винятки, вони не вміють належним чином документувати можливі виняткові ситуації даної реалізації. Вони взагалі покладаються на спеціальну документацію. Це створює ситуації, коли ненадійний характер носія маскується API, що надає зовнішній вигляд надійності. Також при викиді ці винятки втрачають сенс, коли вони рухаються назад через шари абстракції. Оскільки програміст погано задокументований, програміст не може націлити їх конкретно і часто потрібно запускати значно ширшу мережу, ніж це необхідно для того, щоб вторинні системи, якщо вони не спрацювали, не збивали всю систему. Це повертає нас до проблеми ковтання, що перевіряються винятками.
Багатостатеві типи повернення Тут потрібно покластися на розрізнений набір, кортеж чи іншу подібну концепцію, щоб повернути або очікуваний результат, або об'єкт, що представляє виняток. Тут немає розмотування стека, не прорізування коду, все виконується нормально, але повернене значення повинно бути перевірено на помилку перед продовженням. Я ще не дуже працював з цим, тому не можу коментувати досвід, я визнаю, що він вирішує деякі проблеми, винятки, минаючи нормальний потік, але все одно він буде страждати від майже тих же проблем, що і перевірені винятки, як виснажливі та постійно "в обличчі".
Отже, питання:
Який у вас досвід у цьому питанні та що, на вашу думку, є найкращим кандидатом для створення хорошої системи обробки винятків для мови?
EDIT: Через кілька хвилин після написання цього питання я наткнувся на це повідомлення , моторошний!
noexcept
історії на C ++ може дати дуже хороші уявлення про EH в C # та Java.)