Prendi i costruttori C ++ per esempio, sappiamo che non restituiscono valori. Perché all'inizio Bjarne Stroustrup ha deciso non di consentire al costruttore di restituire 'falso' per indicare che fallisce, in modo che il sistema di runtime possa distruggere i membri costruiti proprio come lanciare un'eccezione? Quali sono le preoccupazioni che rendono i progettisti di linguaggi OO decidono non di farlo? L'operatore "nuovo" può quindi restituire "nullptr" se vede che il costruttore restituisce false. Per gli oggetti statici (nell'area .data / .bss o su .stack) il codice di costruzione generato dal compilatore può ancora rilevare e segnalare, interrompere o uscire di conseguenza.
Considerare i seguenti due paradigmi di codifica, utilizzando l'allocazione dinamica come esempio:
objp = new object; // constructor returns 'false', 'new' returns 'nullptr'.
if (objp != nullptr) {
do_something(objp);
} else {
error_handling();
}
confronta con:
try {
objp = new object; // object throw exception when construction failed
do_something(objp);
} catch (const typedException &e) {
error_handling();
}
Se abbiamo bisogno di codificare il motivo del fallimento della costruzione, quest'ultimo usando l'eccezione è ovviamente più utile in quanto non possiamo usare 'objp' per passare alcuna informazione una volta che la costruzione fallisce. Ma se il motivo è semplice (diciamo 'out of memory'), o quando saltare la gestione degli errori non fa male (do_something () potrebbe semplicemente fare la decorazione), abbiamo davvero bisogno di coinvolgere la gestione delle eccezioni in casi così semplici? Che ne dici di consentire l'esistenza di entrambi i paradigmi in C ++?
(Un altro esempio è che per i piccoli compilatori C ++ integrati, se non supportano le eccezioni, possono ancora supportare la gestione della "costruzione fallita" in questo modo.)
Bene, forse il mio paragone è fuorviante, non sono contrario alla gestione delle eccezioni strutturali, al contrario, le eccezioni di LOVE specialmente per i grandi sistemi. Ma quando si tratta di piccoli sistemi embedded in cui sia il codice che lo spazio dati sono scarsi, ci penso due volte.
I frame di gestione delle eccezioni sono simili a setjmp () e longjmp (), che sono piuttosto costosi sia in termini di tempo di esecuzione che di utilizzo della memoria; mentre il confronto (objp == nullptr) richiede solo un confronto e un salto. Per non parlare di alcuni dei compilatori non supportano nemmeno la gestione delle eccezioni. In questi casi, il fallimento della costruzione può essere affrontato solo con altri metodi. Ciò mi ricorda ai vecchi tempi che il Turbo Pascal 5.5 OOP può chiamare "Fail" in caso di errore di costruzione, e l'oggetto appena assegnato sarà nullo.
E le altre lingue? Tutte le lingue OOP utilizzano l'eccezione sui casi di errore di costruzione?
In realtà, nel momento in cui ho imparato C ++ non è disponibile alcuna gestione delle eccezioni (Turbo C ++ 3.0 / Borland C ++ 3.1). Prima di allora ho imparato Turbo Pascal 5.5 che supportava "Fail" in caso di failover dinamico della costruzione. Ma quando mi sposto in C ++ in quel momento questo mi rende un po 'turbato dal momento che non c'è modo di testare i fallimenti di costruzione senza definire una funzione Init () che in realtà faccia gli inits. Da allora mi sono chiesto, perché i costruttori non possono restituire valori?
Ora penso che forse restituire un valore dal costruttore renderà la lingua "incoerente". Se restituiamo un valore da un costruttore e il sistema runtime lo test, questo tipo di comportamento è molto diverso da una normale chiamata di funzione poiché il nostro codice può testarlo. Forse questo tipo di incoerenza non è una buona idea quando si progetta un linguaggio di programmazione? Cosa ne pensi?
All'inizio del C ++ non esisteva alcuna gestione delle eccezioni, tuttavia Bjarne Stroustrup non permetteva ancora ai costruttori di restituire condizioni di errore. Lo stesso ha fatto le altre lingue OO in quel momento (correggimi se sbaglio). Pertanto, usando la gestione delle eccezioni non era la loro intenzione originale di occuparsi del costruttore fallisce. Allora perché? Penso di aver trovato la risposta, per favore fai riferimento a la mia risposta qui . Grazie.