Domanda

So che questo è un programma valido c ++. Qual è il punto del lancio nella funzione declarement? Per quanto ne so non fa nulla e isnt utilizzato per nulla.

#include <exception>
void func() throw(std::exception) { }
int main() { return 0; }
È stato utile?

Soluzione

Questa è una specifica eccezione, ed è quasi certamente un cattiva idea .

Si prevede che func può gettare un std::exception, e qualsiasi altra eccezione che func emette si tradurrà in una chiamata a unexpected() .

Altri suggerimenti

Si specifica che qualsiasi std::exception può essere lanciato da func(), e nient'altro. Se qualcosa d'altro è gettato, chiamerà una funzione unexpected() che di default chiama terminate().

Ciò significa che gettare qualcosa d'altro sarà quasi certamente interrompere il programma, nello stesso modo come un'eccezione non rilevata, ma l'implementazione dovrà rispettare questo. Questo è normalmente molto simile a mettere un blocco try{...}catch(){...} attorno func(), che può inibire prestazioni.

Di solito, le specifiche eccezioni non sono ne vale la pena, in base alle il Guru della settimana colonna su di esso. Il Boost linee guida dicono che ci potrebbe essere un leggero vantaggio con un throws() vuoto per una funzione non in linea e ci sono svantaggi.

Questa è una specifica un'eccezione C ++. Si dichiara che la particolare funzione potenzialmente gettare un tipo std::exception.

Nel però specifiche eccezioni generali in C ++ sono considerati una caratteristica da evitare. Si tratta di una funzione di strano nel comportamento di quel si è dichiarato al momento della compilazione, ma solo controllato in fase di esecuzione (molto diverso dalla versione di esempio Java).

Ecco un buon articolo che scompone la funzione

Questa è una specifica eccezione. Si dice che l'unica eccezione che func () può lanciare è std :: eccezione (o un suo derivato). Il tentativo di gettare qualsiasi altra eccezione darà std :: inaspettato, invece.

specifica eccezione. Il tipo (s) dopo la parola throw specifica esattamente quello che tutti, se del caso, le eccezioni la funzione può buttare. Vedere 15.4 del progetto.

Nota: Una funzione senza specifica delle eccezioni permette tutte le eccezioni. Una funzione con un vuoto specifica delle eccezioni, throw(), non consente eccezioni.

In sostanza questo:

void func() throw(std::exception,B) {  /* Do Stuff */}

è che un sinonimo fro questo:

void func()
{
    try
    {
        /* Do Stuff */ 
    }
    catch(std::exception const& e)
    {
        throw;
    }
    catch(B const& e)
    {
        throw;
    }
    catch(...)
    {
        unexpected();  // This calls terminate
                       // i.e. It never returns.
    }
}

La chiamata terminate () è raramente ciò che si vuole, come lo stack non è svolto, e quindi tutti i vostri sforzi in RAII è sprecato. L'unica eccezione alla regola è dichiarare un elenco tiro vuota e questo è principalmente a scopo di documentazione per dimostrare che si stanno sostenendo il gurantee eccezione non-tiro (si dovrebbe comunque prendere manualmente tutte le eccezioni in questa situazione).

Alcuni luoghi importanti (secondo me) che dovrebbero essere non-tiro sono distruttori e swap) metodi (. I distruttori sono raramente contrassegnati esplicitamente non-tiro, ma swap () sono molto spesso segnata non-tiro.

void myNoThrowFunc() throws()  // No-Throw (Mainlly for doc purposes).
{
    try
    {
        /* Do Stuff */
    }
    catch(...)  // Make sure it does not throw.
    {
        /* Log and/or do cleanup */
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top