2010-01-13 14 views

risposta

12

Senza alcun parametro, significa che le funzioni menzionate non non generano eccezioni.

Se si specifica qualcosa come parametro, si sta dicendo che la funzione genererà solo eccezioni di quel tipo. Si noti, tuttavia, che questo è non un'applicazione per il compilatore. Se si verifica un'eccezione di qualche altro tipo, il programma chiamerà std :: terminate().

+0

Si noti che non tutti i compilatori supportano questa sintassi. Di particolare nota, VS2008 no. –

+0

Davvero ??? Non è una funzionalità particolarmente nuova. –

+0

Questo è il gestore di eccezioni imprevisto predefinito. Un utente può decidere di cambiarlo usando std :: set_unexpected(). Tuttavia, questo in genere non compra molto un utente. Herb Sutter ha un ottimo articolo su GoTW su questo argomento: http://www.gotw.ca/gotw/082.htm – Void

18

È una "specifica eccezione". throw() significa "questa funzione non genererà eccezioni". Puoi anche specificare eccezioni, quindi throw (foo) direbbe che questa funzione può generare eccezioni di tipo foo.

L'utilità di questa funzione è stata discussa un po 'nella comunità C++ - la valutazione generale sembra essere che non è particolarmente utile. Per maggiori dettagli dare un'occhiata a this Herb Sutter article.

+0

Grazie per il collegamento a quell'articolo – Murali

+0

I tipo di oggetto al significato presunto "questa funzione non getterà alcun eccezioni ". Ciò che significa in realtà è più come" le chiamate a questa funzione cattureranno tutte le eccezioni che lancia e terminano ".Se la gente ci pensasse in quel modo, Herb Sutter non avrebbe voluto convincerli che non era molto utile. E soprattutto non penserebbero che le specifiche del lancio vuoto siano un'ottimizzazione. –

+0

@Steve Bene, la maggior parte delle persone _really_ non vogliono avere terminate() chiamato, quindi penso che facciano uno sforzo per far capire ciò che ho detto. Per quanto riguarda le ottimizzazioni, non ho mai visto prima quell'idea. –

1

Questo è chiamato una specifica di lancio. Definisce quali eccezioni (se presenti) possono essere generate dalla funzione.

Questi suoni grandi in teoria, ma ci sono problemi con il loro utilizzo.

Una buona discussione a questo proposito è disponibile in questo SO question.

0

Può lanciare() i parametri?

Sì, può essere utilizzato per dichiarare quali parametri è consentito il metodo di lancio.

Anche il distruttore è contrassegnato come throw(), i distruttori non devono mai generare eccezioni in quanto potrebbero già essere eseguite nel contesto di un'eccezione generata.

+1

Per chiarire, il distruttore come dichiarato è corretto: throw() indica che il distruttore NON genererà un'eccezione, che è il modello appropriato. – Dathan

Problemi correlati