Qual è il vantaggio di limitare i tiri consentiti da una funzione C ++? [chiuso]

StackOverflow https://stackoverflow.com/questions/609332

  •  03-07-2019
  •  | 
  •  

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.

È stato utile?

Soluzione

Nessuno lo spiega meglio di Sutter

http://www.ddj.com/architect/184401544

La versione breve è

  1. Non scrivere mai una specifica di eccezione
  2. 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 lancia -eth dall'interno, perché non c'è nulla che gli impedirà di lanciare. Questo perché, lanciare all'interno di una funzione con una specifica di eccezione vuota equivale a lanciare un'eccezione non menzionata nella specifica e rendere prevedibile 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top