Qual è il vantaggio di limitare i tiri consentiti da una funzione C ++? [chiuso]
Domanda
Qual è il vantaggio di dichiarare le possibili eccezioni da una funzione C ++? In altre parole, cosa fa effettivamente l'aggiunta della parola chiave throw ()
?
Ho letto che una dichiarazione di funzione come void do_something () throw ();
dovrebbe garantire che nessuna eccezione abbia origine dalla funzione do_something ()
; tuttavia, questo non sembra valere per le funzioni chiamate in do_something ()
, rendendolo quindi una garanzia debole.
Descrivi l'utilità (e i casi migliori) di questa funzione linguistica.
Soluzione
Nessuno lo spiega meglio di Sutter
http://www.ddj.com/architect/184401544
La versione breve è
- Non scrivere mai una specifica di eccezione
- Tranne forse uno vuoto
Altri suggerimenti
Lo standard C ++ richiede che venga chiamata la funzione unexpected ()
se una funzione tenta di generare un'eccezione che non è nel suo elenco di eccezioni. Una breve descrizione di questo da MSDN è qui: http: // msdn.microsoft.com/en-us/library/awbt5tew(VS.80).aspx
La maggior parte dei compilatori in realtà non supporta questa funzione C ++.
void do_something() throw();
Questa è una garanzia da parte dell'implementatore che la funzione non genererà mai un'eccezione. Questo è ciò che un cliente della funzione può aspettarsi. Tuttavia, significa anche che qualsiasi eccezione generata da qualche parte all'interno della funzione viene gestita e non riproposta al padre di do_something ()
. Peccato per colui che std :: unexpected ()
seguito dalla conclusione del programma .
A proposito: la definizione generalmente accettata di garanzia di eccezionale eccezione è: se un'operazione pubblica fallisce per qualche motivo, viene generata un'eccezione e lo stato dell'oggetto rimane invariato (operazione atomica).
Fondamentalmente, dichiarando la funzione con throw ();
dici al compilatore che sei sicuro al cento per cento che la funzione è non genererà delle eccezioni, consentendo al compilatore di eseguire alcune ottimizzazioni. Se la tua funzione genera comunque un'eccezione, sei nei guai, poiché molto probabilmente si traduce in un comportamento indefinito.