IMO, перевірені винятки - це хибна реалізація того, що могло бути досить пристойною ідеєю (за зовсім інших обставин - але насправді це навіть не дуже гарна ідея за нинішніх обставин).
Хороша ідея полягає в тому, що було б непогано, щоб компілятор переконався, що всі винятки, які програма може потенційно кинути, будуть вилучені. Недолікова реалізація полягає в тому, що для цього Java змушує вас мати справу з виключенням безпосередньо в будь-якому класі, який викликає все, що оголошено, щоб кинути перевірене виключення. Однією з найосновніших ідей (і переваг) обробки винятків є те, що в разі помилки вона дозволяє проміжним шарам коду, які не мають нічого спільного з певною помилкою, повністю ігнорувати саме її існування. Перевірені винятки (як це реалізовано на Java) цього не дозволяють, тим самим знищуючи головну (первинну?) Перевагу обробки винятків для початку.
Теоретично вони могли зробити перевірені винятки корисними, застосовуючи їх лише на загальнопрограмній основі - тобто, будуючи програму, будувати дерево всіх контурів управління в програмі. Різні вузли на дереві будуть зазначатися 1) винятками, які вони можуть генерувати, та 2) винятками, які вони можуть знайти. Щоб переконатися, що програма була правильною, ви б ходили по дереву, переконуючись, що кожен виняток, який був кинутий на будь-якому рівні в дерево, потрапляв на якийсь більш високий рівень у дереві.
Причина, чому вони цього не зробили (я б припустив, у будь-якому випадку), полягає в тому, що робити це було б важко важко - насправді я сумніваюся, що хтось написав систему складання, яка може зробити це для чого завгодно, але надзвичайно просто (межує з "іграшкою" ") мови / системи. Для Java такі речі, як динамічне завантаження класу, роблять це ще складніше, ніж у багатьох інших випадках. Гірше, що (на відміну від чогось на зразок C) Java не (принаймні нормально) статично не компілюється / не пов'язана з виконуваним файлом. Це означає, що ніщо в системі насправді не має глобальної обізнаності навіть намагатися виконати подібне правозастосування, поки кінцевий користувач фактично не почне завантажувати програму для її запуску.
Здійснювати правозастосування в той момент з кількох причин недоцільно. Перш за все, навіть у кращому випадку це збільшить час запуску, що вже є однією з найбільших, найпоширеніших скарг на Java. По-друге, щоб зробити багато корисного, вам дійсно потрібно виявити проблему досить рано, щоб програміст її виправити. Коли користувач завантажує програму, занадто пізно зробити багато корисного - ваш єдиний вибір на той момент - ігнорувати проблему або взагалі відмовитись від завантаження / запуску програми, виключаючи випадки, що може статися виняток що не було спіймано.
Як і вони, перевірені винятки гірші, ніж марні, але альтернативні варіанти перевірених винятків ще гірші. Хоча основна ідея для перевіряються винятків здається хорошим, це дійсно не дуже добре, і трапляється, особливо бідних , придатний для Java. Для чогось на зразок C ++, що зазвичай компілюється / пов’язується у повний виконуваний файл, не схожий на завантаження / динамічне завантаження класу, ви матимете трохи більше шансів (хоча, чесно кажучи, навіть тоді правильно їх застосовувати без того ж безладу, який вони в даний час причина в Java все ще буде виходити за межі сучасного стану).