voglio derivare da std :: exception per aggiungere informazioni specifiche ai miei file di log, ma non riesco a capire come accedere a .what() dall'eccezione std ::.derivante da std :: exception
Inoltre, so che non è sicuro creare una stringa nel mio gestore di eccezioni, ma non sono un esperto in questo argomento, quindi quali sono alcune alternative più sicure?
struct Exception : public std::exception, private boost::noncopyable
{
public:
Exception(std::string msg)
: message(msg)
{}
~Exception()
{}
virtual const char* what() const throw
{
std::string what = message + // and now what? base.what()
LOG(what); // write to log file
return what.c_str();
}
private:
std::string message;
};
EDIT: ho davvero chiesto la mia domanda nel modo sbagliato. Sono piuttosto interessato alla sicurezza, ho solo pensato che sarebbe bello avere più dati per la registrazione. Mi sbagliavo.
ora, non sono così paranoico su bad_alloc che viene lanciato dalla stringa del messaggio in caso ci fosse un bad_alloc prima, preferirei avere un messaggio pulito. Detto questo ho riscritto alcune cose:
struct Exception : public std::exception
{
public:
Exception(std::string msg)
: message(msg)
{}
~Exception()
{}
virtual const char* what() const throw
{
LOG(what); // write to log file
return what.c_str();
}
private:
std::string message;
};
ci sono ancora grandi preoccupazioni su quel codice ora? il LOG() lancia std :: exception in caso qualcosa vada storto, perché non volevo un ciclo infinito di chiamate di log per classe di derivazione derivata, e quella classe chiamava ancora log che avrebbe causato di nuovo la stessa esecuzione. Funzionerà come voglio, o un'eccezione di registrazione nella mia chiamata di classe derivata terminate() o causerà il core dump?
Re: alternative più sicure. Questa è una grande domanda. Adatto per la propria domanda. –
Benvenuti in Stack Overflow. Sembra che tu stia chiedendo * due * domande (il che significa che dovresti fare due post separati). Uno chiede come chiamare il metodo ereditato dalla classe base, e l'altro chiede come memorizzare un messaggio di eccezione senza come stringa (presumibilmente perché non si vuole allocare memoria e si incorre nel rischio di un 'bad_alloc'). Né ha davvero nulla a che fare con derivare da 'std :: exception' in particolare. Domande specifiche separate portano a titoli di domande più descrittivi e risposte più utili. Si prega di considerare la divisione di questa domanda. –
Se il codice genera un'eccezione di tipo Exception ("..."), cosa si aspetta che std :: exception :: what() restituisca? Non penso che contenga qualcosa di utile (se contiene qualcosa). Suggerirei semplicemente di restituire message.c_str(). – Ferruccio