2009-09-11 18 views
13

Ho iniziato a utilizzare le eccezioni C++ in modo uniforme e ora mi piacerebbe che il compilatore (g ++) verificasse che non ci siano "perdite di eccezioni". La decorazione throw dovrebbe fare questo, come lo fa const per i metodi di costanza di classe.Esiste un uso per la decorazione del lancio C++?

Bene, non è così.

L'utilizzo di throw è ancora documentario, ma potrebbe anche essere pericolosamente fuorviante se altri ritengono che una funzione non possa introdurre altre eccezioni oltre a quelle elencate nella relativa documentazione.

Può g ++ essere in qualche modo persuaso a essere più severo nel suo controllo del tiro, cioè assicurandosi che una funzione decorata come throw() non getti mai più nulla.

Modifica: Trovato this question che gestisce ampiamente l'argomento.

+0

domanda simile qui: http://stackoverflow.com/questions/1037575/why-arent-exceptions-in-c-checked-by-the-compiler – Glen

risposta

15

Non controlla la compilazione in tempo, ma un compilatore conforme dovrebbe garantirlo in fase di esecuzione.

Se una funzione genera qualcosa al di fuori della sua dichiarazione di lancio, il runtime del C++ dovrebbe chiamare std :: inatteso, se ricordo correttamente.

+0

Questo è il mio Comprensione anche Perché vorresti che lo facesse, quindi non ne ho idea. Personalmente trovo 'GetFoo() // throws (std :: runtime_error)' molto più utile dell'equivalente non commentato - proprio come un suggerimento per i consumatori del mio codice. –

+1

corretto. Il problema pratico per il controllo in fase di compilazione è che la maggior parte del codice C++ esistente non ha specifiche di lancio. – MSalters

+8

Visual C++ 2008 non supporta questa parte dello standard. –

0

Non so se il correttore/compilatore può farlo. Forse è più semplice commentarlo nella dichiarazione di funzione. Beh, non è affatto infallibile, ma se le persone vedono che può esserci un'eccezione generata dalla maggior parte della gente, avvolgerà la chiamata della funzione in try and catch.

//Can throw Exception 
GetFoo(); 
2

Fondamentalmente, le specifiche delle eccezioni sono valide solo come specifiche delle eccezioni vuote. Altrimenti, penso che siano un esperimento fallito. Vedi phlipsy's answer perché.

8

Vorrei anche raccomandare di esaminare il saggio this sulle specifiche delle eccezioni. Essa sottolinea i problemi di questo C++ caratteristica come:

  • Si tratta di un sistema di tipo ombra
  • I controlli del compilatore gettati eccezioni solo in fase di esecuzione
  • Il comportamento predefinito attivato nel caso di un eccezione generata, ma non specificato di solito è inutilizzabile e spesso frainteso dai programmatori
Problemi correlati