Qual è la ragione per cui le eccezioni sono pesantemente utilizzate nei linguaggi gestiti (C # e Java) ma non in C ++? [chiuso]

6

AFAIK, molti progetti C ++ non consentono eccezioni e negano loro le linee guida sulla codifica. Ho molti motivi, ad esempio, l'eccezione è difficile da gestire correttamente se il tuo binario deve essere compilato da compilatori separati e diversi.

Ma non mi convince del tutto, ci sono molti progetti che usano solo un compilatore. Rispetto al C ++, le eccezioni sono molto utilizzate in C # e Java e la ragione può essere che l'eccezione non porta abbastanza benefici.

Un punto è la debugabilità nella pratica. L'eccezione non può ottenere lo stack di chiamate nel codice C ++, ma in C # e Java è possibile ottenere lo stack di chiamate dall'eccezione, è significativo e facilita il debug. No-callstack non è colpa dell'eccezione, è la differenza linguistica, ma influisce sull'utilizzo delle eccezioni.

Quindi qual è la ragione per cui le eccezioni sono disapprovate nei programmi c ++?

    
posta ZijingWu 05.11.2013 - 05:57
fonte

4 risposte

10

Ci sono due ragioni principali per cui le eccezioni in C ++ sono spesso evitate.

  • Codice precedente
  • Paura / incertezza / dubbio (FUD)

Le eccezioni richiedono che tu sappia che, anche se non fai da te un'eccezione, qualsiasi funzione chiamata potrebbe generare un'eccezione e dovresti essere in grado di gestirla con garbo (per lo meno senza perdite di risorse). Quando le eccezioni furono introdotte per la prima volta in C ++, questa consapevolezza non esisteva ancora da molti sviluppatori C ++. Se si aggiunge che un sacco di codice C esistente è stato convertito in C ++ e che l'ambiente di runtime C ++ non offre molti aiuti per evitare perdite di memoria, si ottiene una grande quantità di codice C ++ legacy che non è eccezionalmente sicuro .

L'iniziale mancanza di consapevolezza su come scrivere un codice eccezionalmente sicuro causa anche molta paura, incertezza e dubbio, perché le eccezioni hanno funzionato in modo così diverso dai noti meccanismi di controllo del flusso che molta della saggezza comune per scrivere applicazioni robuste aveva essere rivalutato in modo critico.

Nessuno di questi problemi esiste per C # e Java perché quelle lingue si sono verificate solo quando le eccezioni erano già state meglio comprese, hanno una garbage collection quindi c'è una risorsa importante che non devi curare con attenzione e che don ' t avere un codice legacy pre-eccezione.

    
risposta data 05.11.2013 - 10:08
fonte
6

Le linee guida per lo stile di Google C ++ dicono:

We do not use Exceptions.

In questa guida , puoi trovare un elenco di pro e contro di eccezioni in C ++ e una discussione sul perché hanno deciso di non usarli. Sento che questi si applicano a molti progetti, non solo a quelli di Google.

Fondamentalmente, la ragione è "compatibilità con il codice legacy".

    
risposta data 05.11.2013 - 10:02
fonte
2

a lot of C++ projects don't allow exceptions and deny them in coding guidelines

Direi ignoranza. Non capiscono cosa significhi eccezione, e misurano anche quanto tempo ci vuole per svolgere lo stack.

Exception are not bringing enough benefit.

L'alternativa alle eccezioni è una specie di codice spaghetti e una maggiore complessità. Che si traduce direttamente in tempo / impegno / denaro.

Ad esempio, che cosa fai se la costruzione di un oggetto fallisce?

Aggiungendo solo eccezioni a un programma c (e nient'altro da c ++), la complessità sarebbe notevolmente ridotta.

Exception can not get the call stack in C++ code

È possibile ottenere il backtrace e questa risposta mostra come eseguirlo.

    
risposta data 05.11.2013 - 09:00
fonte
0

Il ragionamento da me seguito per scegliere di non utilizzare le eccezioni nel codice C ++ a meno che non fosse immediatamente visibile un'alternativa valida era il sovraccarico delle risorse gestite e la rottura del normale flusso di cose.

link

L'articolo nel link sopra riportato è una riproduzione di qualcosa che è stato pubblicato per la prima volta nel 1994 in C ++ Report di Tom Cargill.

Direi che è più difficile fare correttamente la gestione delle eccezioni nel codice C ++ e che i bug possono essere molto difficili da trovare. Come scrive Tom Cargill

The really hard part of using exceptions is to write all the intervening code in such a way that an arbitrary exception can propagate from its throw site to its handler, arriving safely and without damaging other parts of the program along the way.

    
risposta data 05.11.2013 - 11:18
fonte

Leggi altre domande sui tag