Sono convinto a questo punto che dovrei creare sottoclassi di std::exception
per tutte le mie esigenze di lancio di eccezioni. Ora sto osservando come sovrascrivere il metodo what
.Restituisce una stringa dinamica da std :: exception `what`
La situazione che sto affrontando, sarebbe davvero utile se la stringa what
restituisce essere dinamici. Alcuni pezzi di codice analizzano un file XML, ad esempio, e per me è utile aggiungere una posizione o un numero di riga al messaggio di errore.
Sto cercando di seguire lo Boost Exception handling guidelines.
Quello che mi piacerebbe sapere:
what
restituisce unaconst char *
, che implica qualsiasi catcher è probabile che non andare a liberare la stringa. Quindi ho bisogno di un altro posto per archiviare il risultato, ma dove sarebbe? (Ho bisogno di thread-safety.)what
include anchethrow()
nella sua firma. Mentre posso impedire al miowhat
di lanciare qualsiasi cosa, mi sembra che questo metodo non sia destinato a qualcosa di troppo dinamico. Sewhat
non è il posto giusto, allora dove dovrei fare questo invece?
Dalle risposte che ho ottenuto finora, sembra che l'unico modo per raggiungere questo obiettivo è memorizzando la stringa nel eccezione. Le linee guida di Boost raccomandano questo, che mi confonde, perché lo std::runtime_error
fa proprio questo.
Anche se dovessi utilizzare una stringa C, dovrei usare un buffer di dimensioni statiche, o fare una gestione della memoria che può fallire anche. (Mi chiedo se questa sia l'unica cosa che può andare storta nel costruttore di copie di std::string
. Ciò significherebbe che non otterrò nulla usando stringhe di C allocate dinamicamente.)
C'è qualche altra opzione sinistra?
Aggiunto il punto della linea guida Boost, ri-modificare se non è adatto. –