Ho creato una classe generale che accetta una stringa quando è costruita, e sputa quella stringa quando un utente chiama what (). Questo è tutto ciò che fa; al lancio, restituisce la stringa di inizializzazione.
class Exception_As {
private:
std::string message
public:
Exception_As(const std::string& message) { // constructor
this->message ="EXCEPTION: " +message;
}
virtual const char* what() const throw() {
return message.c_str();
}
}
Come uso la mia classe di eccezioni personalizzata:
bool check_range(
const std::vector<std::string>& list,
const unsigned& idx_start, // where to start checking
const unsigned& idx_end, // where to stop checking
const std::string& key
) {
if ( idx_start > idx_end ) {
throw Exception_As("check_range: start index > end index: now fix it! :D");
}
... rest of code
} // end of check_range
Come user user check_range:
// some other user code using my check_range
void main() {
try {
... set up variables
my_hero_qualified = check_range(semi_finalists, third_place, first_place, my_hero);
...rest of code
}
catch (const Exception_As& e) {
std::cout << e.what() << std::endl;
}
}
Se il try / catch non era presente, abortirebbe il programma a causa dell'eccezionata Exception_As. Se era lì, l'utente sarebbe stato avvisato che "check_range: start index > index finale: ora aggiustalo!: D". Per me, sicuramente batte scrivendo tonnellate di classi BadEvent1Exception, BadEvent2Exception, ecc.
Riesco a vedere che sono pigro con questo metodo, e sì, non posso fare niente di speciale come modificare valori basati su eccezioni o metamorfosi sullo stato di un oggetto; ma se hai appena inserito un territorio inaspettato, chissà se lo gestisci correttamente? Puoi anche terminarlo in modo da poter aggiustare ciò che è successo e svilupparlo correttamente.
Quindi, domanda: se tutte le eccezioni fanno è interrompere il programma in circostanze impreviste, non sarà sufficiente una singola classe di eccezioni che restituisce il problema?
... O le eccezioni dovrebbero fare comunque altre cose? In caso contrario, perché creare così tante classi di eccezioni che hanno nomi diversi, certo, ma da quello che ho visto, riportano solo che qualcosa è andato storto.