2009-03-04 6 views
11

Qual è il vantaggio di dichiarare le possibili eccezioni generate da una funzione C++? In altre parole, cosa aggiunge effettivamente la parola chiave throw()?Qual è il vantaggio di limitare i lanci consentiti da una funzione C++?

Ho letto che una dichiarazione di funzione come void do_something() throw(); dovrebbe garantire che nessuna eccezione provenga dalla funzione do_something(); tuttavia, questo non sembra valere per le funzioni chiamate all'interno di do_something(), rendendola quindi una garanzia debole.

Descrivere l'utilità (e i casi migliori) di questa funzione lingua.

risposta

0

In sostanza, dichiarando la funzione con throw(); voi dire al compilatore che siete al cento per cento certo che la funzione è non intenzione di gettare le eventuali 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.

+2

Be comportamento definito, in realtà: chiama inaspettato(). Comportamento mal attuato, sì, ma ben definito. – MSalters

5

Lo standard C++ richiede che venga chiamata la funzione unexpected() se una funzione tenta di generare un'eccezione non presente nell'elenco delle 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 funzionalità C++.

+1

>> La maggior parte dei compilatori in realtà non supporta questa caratteristica C++ << - e per un esempio, vedere la pagina della documentazione MSVC che hai indicato ... –

1
void do_something() throw(); 

Questa è una garanzia da parte dell'implementatore che la funzione non genererà mai un'eccezione. Questo è ciò che si aspetta un cliente della funzione . Tuttavia, significa anche che qualsiasi eccezione generata da qualche parte all'interno della funzione viene gestita e non ricondotta al padre di do_something(). Peccato per colui che risponde a throw dall'interno, perché non c'è nulla che gli impedisca di lanciare. Questo perché, lanciare da una funzione con una specifica di eccezione vuota equivale a lanciare un'eccezione non menzionata nelle specifiche e rendere prevedibile il std::unexpected() seguito dalla chiusura del programma.

BTW: La definizione generalmente accettata di garanzia di eccezione forte è: Se un'operazione pubblica non riesce per qualche motivo, viene generata un'eccezione e lo stato dell'oggetto rimane invariato (operazione atomica).