Non so se esista o meno una teoria, ma potrebbe esserci una scienza sperimentale pragmatica emergente.
La migliore fonte che mi viene in mente è Bjarne Stroustrup, The Design and Evolution of C ++, Addison-Wesley, 1994 . Se ricordo bene (è un ottimo libro e la gente continua a prenderlo in prestito da me e non restituirlo, quindi al momento non ne ho una copia) c'è un capitolo sulle eccezioni. Il comitato C ++ sotto Stroustrup ha richiesto molte prove empiriche che una caratteristica proposta fosse necessaria prima che fossero disposti ad aggiungerla alla definizione del linguaggio. La pagina di Wikipedia sulle eccezioni ha la seguente citazione da quel libro:
Alla riunione del Palo Alto [C ++ standardization] del novembre 1991, abbiamo ascoltato un brillante riassunto degli argomenti per la semantica di terminazione supportati sia dall'esperienza personale che dai dati di Jim Mitchell (di Sun, precedentemente di Xerox PARC). Jim aveva usato la gestione delle eccezioni in una mezza dozzina di lingue per un periodo di 20 anni ed era uno dei primi fautori della semantica della ripresa come uno dei principali progettisti e implementatori del sistema Cedar / Mesa di Xerox. Il suo messaggio era che la terminazione è preferita alla ripresa; questa non è una questione di opinione, ma una questione di anni di esperienza. La ripresa è seducente, ma non valida. Ha sostenuto questa affermazione con l'esperienza di diversi sistemi operativi. L'esempio chiave è stato Cedar / Mesa: è stato scritto da persone che hanno gradito e usato la ripresa, ma dopo dieci anni di utilizzo, c'era solo un uso della ripresa nel sistema di mezzo milione di linee - e quella era un'indagine di contesto. Poiché la ripresa non era effettivamente necessaria per una tale indagine contestuale, la rimossero e trovarono un aumento significativo della velocità in quella parte del sistema. In tutti i casi in cui la ripresa era stata utilizzata, nel corso dei dieci anni era diventata un problema e un progetto più appropriato l'aveva sostituito. Fondamentalmente, ogni uso della ripresa aveva rappresentato un fallimento nel mantenere separati i livelli separati di astrazione. In tutti i casi in cui la ripresa era stata utilizzata, nel corso dei dieci anni era diventata un problema e un progetto più appropriato l'aveva sostituito. Fondamentalmente, ogni uso della ripresa aveva rappresentato un fallimento nel mantenere separati i livelli separati di astrazione. In tutti i casi in cui la ripresa era stata utilizzata, nel corso dei dieci anni era diventata un problema e un progetto più appropriato l'aveva sostituito. Fondamentalmente, ogni uso della ripresa aveva rappresentato un fallimento nel mantenere separati i livelli separati di astrazione.
In C ++ la vera vittoria è RAII , che semplifica molto la gestione della deallocazione delle risorse durante gli errori. (Non elimina la necessità di throw
e try
- catch
, ma significa che non è necessario finally
.)
Penso che la cosa che li ha convinti di aver bisogno di eccezioni siano i contenitori generici: il writer dei contenitori non sa nulla dei tipi di errori che gli oggetti contenuti potrebbero dover restituire (tanto meno come gestirli), ma il codice che ha inserito quegli oggetti nel Il contenitore deve sapere qual è l'interfaccia di quegli oggetti. Ma poiché non sappiamo nulla del tipo di errori che gli oggetti contenuti possono generare, non possiamo standardizzare i tipi di eccezione. (Controposizionalmente: se potessimo standardizzare i tipi di eccezione, non avremmo bisogno di eccezioni.)
L'altra cosa che le persone sembrano aver appreso negli anni è che le specifiche delle eccezioni sono difficili da inserire correttamente in una lingua. Vedere ad esempio questo: http://www.gotw.ca/publications/mill22.htm o questo: http://www.gotw.ca/gotw/082.htm . (E non è solo C ++, i programmatori Java hanno anche lunghi argomenti sulle loro esperienze con eccezioni controllate contro non controllate .)
Un po 'di storia delle eccezioni. L'articolo classico è: John B. Goodenough: "Gestione delle eccezioni: problemi e notazione proposta", Comun. ACM 18 (12): 683-696, 1975. Ma prima erano note eccezioni. Mesa li ebbe nel 1974 e forse anche io / PL. Ada aveva un meccanismo di eccezione prima del 1980. Credo che le eccezioni del C ++ siano state maggiormente influenzate dall'esperienza con il linguaggio di programmazione CLU di Barbara Liskov del 1976 circa. Barbara Liskov: "Una storia di CLU", in Storia dei linguaggi di programmazione --- II , Thomas J. Bergin, Jr. e Richard G. Gibson, Jr. (a cura di). pagine 471-510, ACM, 1996 .