sto leggendo questa pagina http://www.cplusplus.com/doc/tutorial/exceptions.html dice se scrivo function() throw(); nessuna eccezione può essere generata in quella funzione. Ho provato in msvc 2005 scrivendo throw(), throw (int), throw() e niente del tutto. ognuno aveva lo stesso identico risultato. Niente. Ho lanciato int, char *, un altro tipo ed è stato catturato allo stesso modo. Sembra che il lancio non lo influenzi affatto. Cosa fa effettivamente function() throw()?sulle eccezioni C++. func() throw()
risposta
Vedi this article per i dettagli sulle specifiche di eccezione C++ e implementazione di Microsoft:
Microsoft Visual C++ 7.1 ignora le specifiche eccezioni a meno che non siano vuote. Le specifiche delle eccezioni vuote equivalgono a
__declspec(nothrow)
e possono aiutare il compilatore a ridurre le dimensioni del codice.[...] Se vede una specifica di eccezione vuota, assumerà che tu sappia cosa stai facendo e ottimizzi i meccanismi per gestire le eccezioni. Se la tua funzione tira comunque - beh, vergogna per te. Usa questa funzione solo se sei positivo al 100%, che la tua funzione non gira e non lo farà mai.
un'eccezione non basta, è necessario un blocco try {} catch()
per intercettare le eccezioni. Se non si rilevano eccezioni, viene chiamato std::terminate()
e il programma si interrompe bruscamente. Prenditi un po 'di tempo e vai allo this.
Quale non è quello che stava chiedendo. –
specifiche tiro sono progettati per due scopi:
per servire come un contratto tra interfaccia implementata e interfaccia utente - si stato, che le eccezioni possono essere throwned dal tuo metodo, alcune persone considerano parte di un'interfaccia . (contratto) Ala controllò le eccezioni in Java.
Come un modo per segnalare al compilatore che si può applicare alcune ottimizzazioni in caso senza eccezioni possono essere gettati da un metodo/procedura (la creazione di eccezione i costi di movimentazione qualcosa)
un'eccezione non specificata in throw() clausola è un errore, tuttavia in nessun punto è l'implementazione richiesta per verificarlo per voi.. In effetti non è nemmeno possibile verificare, poiché include tutte le possibili eccezioni dalle subroutine chiamate subroutine. (possibilmente da altri moduli) Non è nemmeno possibile all'interno di un singolo modulo, come si riduce facilmente a un problema di interruzione :)
Completamente errato per C++. Le specifiche di eccezione devono essere verificate in fase di runtime e in generale non consentono ottimizzazioni. –
Non è questo il mio punto. Non è richiesto il check in COMPILE-TIME. Consentono inoltre l'ottimizzazione in caso di NESSUNA ECCEZIONE (le domande frequenti sulla lingua IMHO C++ lo menzionano). Quindi il tuo voto non è corretto. – EFraim
Quello che stai scoprendo è che quella versione di VC++ non impone eccezioni specifiche. Credo che sia stato documentato come una variazione rispetto allo standard.
Tuttavia, le specifiche delle eccezioni di solito non sono una buona idea. Se un programma li viola in un'implementazione conforme agli standard (che il VC++ di VS 2005 non era in questo caso), il sistema dovrebbe catturarlo. Ciò significa che la specifica non è un suggerimento per l'ottimizzazione del compilatore, ma piuttosto costringe il compilatore ad andare a lunghezze aggiuntive ea volte a produrre codice subottimale.
Vedere the Boost rationale per motivi per cui il progetto Boost, molto apprezzato, non utilizza le specifiche delle eccezioni. Questo è Boost, che è qualcosa del bambino dei poster che fa cose strane e utili con parti avanzate della lingua.
Citando A Pragmatic Look at Exception Specifications:
(Mis) comprensioni
La seconda questione ha a che fare con sapendo quello che stai ricevendo. Come molti persone di rilievo, tra gli autori dell'eccezione Boost specifica razionale, hanno messo, programmatori tendono ad usare eccezioni specifiche come se si comportavano il modo in cui il programmatore vorrebbe, invece del modo in cui effettivamente fanno comportarsi.
Ecco quello che molti pensano che le specifiche eccezione fanno:
garanzia che le funzioni getterà solo eccezioni elencate (possibilmente nessuno).
Abilitare le ottimizzazioni del compilatore in base alla consapevolezza che solo le eccezioni elencate (eventualmente nessuna) saranno generate .
Le aspettative di cui sopra sono, di nuovo, apparentemente vicino ad essere corretta.
Vedere il collegamento per tutti i dettagli.
Questo è molto diverso da quello che dice lo standard ... Immagino un motivo in più per non usarli –
Grazie per la modifica, Shog;) –