Domanda

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 affatto. ognuno ha avuto gli stessi esatti risultati. Niente. Ho lanciato int, char *, un altro tipo e tutto è stato catturato allo stesso modo. Sembra che il lancio non influisca affatto. Cosa fa effettivamente la funzione () throw ()?

È stato utile?

Soluzione

Vedi questo articolo per dettagli sulle specifiche delle eccezioni C ++ e l'implementazione di Microsoft:

  

Microsoft Visual C ++ 7.1 ignora le specifiche delle eccezioni a meno che non siano vuote. Le specifiche vuote delle eccezioni equivalgono a __declspec (nothrow) e possono aiutare il compilatore a ridurre le dimensioni del codice.

     

[...] Se vede una specifica di eccezione vuota, supporrà che tu sappia cosa stai facendo e ottimizzi i meccanismi per gestire le eccezioni. Se la tua funzione si lancia comunque - beh, vergogna per te. Usa questa funzione solo se sei sicuro al 100% che la tua funzione non si lancia e non lo farà mai.

Altri suggerimenti

Quello che stai scoprendo è che quella versione di VC ++ non applicava eccezioni alle 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 in questo caso 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 impone al compilatore di fare lunghezze extra, e talvolta produce un codice non ottimale.

Vedi the Boost rationale per i motivi per cui il molto apprezzato Boost il progetto non utilizza le specifiche di eccezione. Questo è Boost, che è qualcosa del bambino poster per fare cose strane e utili con parti avanzate della lingua.

Citando da Uno sguardo pragmatico alle specifiche delle eccezioni :

  

(Mis) intese

     

Il secondo problema riguarda   sapendo cosa stai ottenendo. Come molti   persone importanti, compresi gli autori   delle specifiche delle eccezioni Boost   razionale, l'ho detto,   i programmatori tendono a usare l'eccezione   specifiche come se si comportassero   il modo in cui il programmatore vorrebbe,   invece del modo in cui lo fanno realmente   comportarsi.

     

Ecco cosa ne pensano molte persone   le specifiche di eccezione fanno:

     
      
  • Garantire che le funzioni genereranno solo le eccezioni elencate (possibilmente   nessuno).

  •   
  • Abilita le ottimizzazioni del compilatore in base alle conoscenze elencate solo   le eccezioni (forse nessuna) saranno   gettato.

  •   
     

Le aspettative di cui sopra sono, di nuovo,   ingannevolmente vicino a essere corretto.

Vedi il link per i dettagli completi.

Generare un'eccezione non è sufficiente, è necessario un blocco try {} catch () per rilevare le eccezioni. Se non si rilevano eccezioni, viene chiamato std :: terminate () e il programma si chiude improvvisamente. Prenditi un po 'di tempo e vai su questo .

Le specifiche di lancio sono progettate per due scopi:

  1. Per fungere da contratto tra l'interfaccia implementata e l'utente dell'interfaccia - dichiari quali eccezioni possono essere generate dal tuo metodo, alcune persone lo considerano parte di un'interfaccia. (contratto) Ala ha verificato le eccezioni in Java.

  2. Come un modo per segnalare al compilatore che può applicare determinate ottimizzazioni nel caso in cui nessuna eccezione possa essere generata da un metodo / procedura (l'impostazione della gestione delle eccezioni costa qualcosa)

Lancio di un'eccezione non specificata nella clausola throw () è un errore, tuttavia in nessun momento l'implementazione è necessaria per verificarla . In realtà non è nemmeno possibile verificarlo, poiché include tutte le possibili eccezioni dalle subroutine alle chiamate delle subroutine. (possibilmente da altri moduli) Non è nemmeno possibile all'interno di un singolo modulo, poiché è facilmente ridotto a un problema di arresto :)

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