Puoi davvero avere una funzione / metodo senza un corpo ma solo un blocco try / catch?

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

  •  22-07-2019
  •  | 
  •  

Domanda

Nota che questa funzione non ha un " {" e "} " corpo. Solo un blocco try / catch:

void func( void )
try
{
    ...
}
catch(...)
{
    ...
}

Fa parte intenzionalmente di C ++ o è un'estensione g ++?

Esiste uno scopo diverso da quello di bypassare 1 livello di {}?

Non ne avevo mai sentito parlare fino a quando mi sono imbattuto in http://stupefydeveloper.blogspot.com/2008/10/c-function-try-catch-block.html

È stato utile?

Soluzione

Sì, è standard. I blocchi di prova delle funzioni, come vengono chiamati, non sono molto utili per le normali funzioni, ma per i costruttori, ti permettono di catturare le eccezioni lanciate nella lista degli inizializzatori.

Si noti che, nel caso del costruttore, l'eccezione verrà sempre riproposta alla fine di eventuali blocchi di cattura.

Altri suggerimenti

Sì, questo è C ++ valido. Uno scopo che ho trovato è quello di tradurre le eccezioni in valori restituiti e fare in modo che il codice traduca le eccezioni in valori restituiti separati dall'altro codice nella funzione. Sì, puoi restituire x; da un blocco catch come quello che hai mostrato (l'ho scoperto solo di recente, in realtà). Ma probabilmente userei solo un altro livello di parentesi graffe e inserirò la funzione try / catch all'interno della funzione in quel caso. Sarà più familiare alla maggior parte dei programmatori C ++.

Un altro scopo è quello di rilevare le eccezioni generate da un elenco di inizializzatori del costruttore, che utilizza una sintassi simile:

struct f {
    g member;
    f() try { 
        // empty
    } catch(...) { 
        std::cerr << "thrown from constructor of g"; 
    }
};

Herb Sutter ha un buon articolo su questo: http://www.gotw.ca/gotw /066.htm .

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