Я не знаю, існує чи немає теорії, але може виникнути нова прагматична експериментальна наука.
Найкращим джерелом, про який я можу придумати, є Bjarne Stroustrup, The Design and Evolution of C ++, Addison-Wesley, 1994 . Якщо я правильно пам’ятаю (це дуже хороша книга, і люди продовжують позичати її у мене, а не повертати її, тому в даний момент у мене немає копії) є розділ про винятки. Комітет C ++ в рамках Stroustrup вимагав багато емпіричних доказів того, що запропонована функція необхідна, перш ніж вони будуть готові додати її до мовного визначення. Сторінка Вікіпедії про винятки містить таку цитату з цієї книги:
На зустрічі Пало Альто [стандартизація C ++] у листопаді 1991 року ми почули блискучий підсумок аргументів щодо семантики припинення, підкріплених як особистим досвідом, так і даними Джима Мітчелла (від Sun, раніше від Xerox PARC). Джим використовував обробку винятків на півтисячі мов протягом 20 років і був раннім прихильником відновлення семантики відновлення як один з головних розробників та впроваджувачів системи кедрів / меси Xerox. Його повідомлення було припинення переваги над відновленням; це не питання думки, а питання багаторічного досвіду. Відновлення спокусливе, але недійсне. Він підкріпив це твердження досвідом декількох операційних систем. Ключовим прикладом був Кедр / Меса: його написали люди, яким сподобалось та використали відновлення, але після десяти років використання, у системі півмільйона ліній залишилось лише одне використання відновлення - і це було розслідуванням контексту. Оскільки відновлення насправді не було необхідним для такого розслідування контексту, вони усунули його та виявили значне збільшення швидкості в цій частині системи. У кожному випадку, коли було використано відновлення, це протягом десяти років - стало проблемою, і більш підходящий дизайн замінив його. По суті, кожне використання відновлення означало неспроможність утримувати окремі рівні абстракції, що не суперечать. У кожному випадку, коли було використано відновлення, це протягом десяти років - стало проблемою, і більш підходящий дизайн замінив його. По суті, кожне використання відновлення означало неспроможність утримувати окремі рівні абстракції, що не суперечать. У кожному випадку, коли було використано відновлення, це протягом десяти років - стало проблемою, і більш підходящий дизайн замінив його. По суті, кожне використання відновлення означало неспроможність утримувати окремі рівні абстракції, що не суперечать.
У C ++ справжній виграш - RAII , що значно полегшує обробку ресурсів під час помилок. (Це не усуває потреби throw
та try
- catch
, але це означає, що вам це не потрібно finally
.)
Я думаю, що те, що переконало їх у тому, що вони потребують винятку, - це загальні контейнери: письменник контейнерів нічого не знає про помилки, які можуть містити об'єкти, що містяться (набагато менше, як з ними обробляти), але про код, який вставив ці об'єкти в контейнер повинен щось знати про те, що таке інтерфейс цих об'єктів. Але оскільки ми нічого не знаємо про те, які помилки можуть містити об'єкти, ми не можемо стандартизувати типи винятків. (Контрастно: якщо ми могли б стандартизувати типи винятків, то нам би не потрібні винятки.)
Інша річ, яку люди, здається, навчилися роками, - це те, що специфікації виключень важко правильно викласти мовою. Дивіться, наприклад, це: http://www.gotw.ca/publications/mill22.htm , або це: http://www.gotw.ca/gotw/082.htm . (І це не лише C ++, у програмістів Java також є тривалі аргументи щодо їх досвіду із перевіреними порівняно з неперевіреними винятками .)
Трохи про історію винятків. Класичний документ: John B. Goodenough: "Обробка винятків: питання та запропонована нотація", Commun. ACM 18 (12): 683-696, 1975. Але раніше були відомі винятки. Меса мав їх приблизно в 1974 році, і PL / я, можливо, теж їх мав. Ада мала механізм винятків до 1980 року. Я вважаю, що на винятки C ++ найбільше вплинув досвід роботи з програмою мови програмування Барбари Ліськов приблизно з 1976 року. Барбара Лісков: "Історія CLU" в історії мов програмування --- II , Томас Дж. Бергін-молодший та Річард Г. Гібсон-молодший (ред.). С. 471–510, ACM, 1996 .