Si prega di dare un'occhiata al seguente lancio eccezione e la cattura di:Sta rilevando un'eccezione per riferimento pericoloso?
void some_function() {
throw std::exception("some error message");
}
int main(int argc, char **argv) {
try {
some_function();
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
exit(1);
}
return 0;
}
E 'sicuro di catturare l'eccezione generata per riferimento?
La mia preoccupazione è che l'eccezione e
è in realtà posto sulla pila disome_function()
. Ma some_function()
è appena tornato, causando la distruzione di e
. Quindi in realtà ora e
punti a un oggetto distrutto.
La mia preoccupazione è corretta?
Qual è il modo corretto per superare l'eccezione senza copiarlo in base al valore? Devo lanciare new std::exception()
così viene inserito nella memoria dinamica?
nota che il costruttore di stringhe per std :: exception non è standard, questa è un'estensione MS (conforme?). http://stackoverflow.com/questions/5157206/why-does-stdexception-have-extra-constructors-in-vc – Sigismondo
Quindi, come si può assegnare un messaggio all'eccezione, quindi viene stampato usando 'what()'? – SomethingSomething
@SomethingQualcosa si usa una derivata di 'std :: exception' che consente di passare il messaggio al costruttore. 'std :: runtime_error' per esempio. E la convenzione di lanciare sottotipi è esattamente la ragione per cui dovresti prendere (riferimento) riferimento. – user2079303