Non riesco proprio a capire come un utente sia in grado di distinguere tra le eccezioni che le mie funzioni possono generare. Una delle mie funzioni può generare due istanze di std::invalid_argument
.Distinzione tra più eccezioni dello stesso tipo
Per esempio, in un costruttore:
#include <stdexcept> // std::invalid_argument
#include <string>
class Foo
{
public:
void Foo(int hour, int minute)
:h(hour), m(minute)
{
if(hour < 0 || hour > 23)
throw std::invalid_argument(std::string("..."));
if(minute < 0 || minute > 59)
throw std::invalid_argument(std::string("..."));
}
}
Nota: E 'un esempio, si prega di non rispondere con numeri interi limitati.
Supponiamo che l'utente chiami con foo(23, 62);
, in che modo il gestore delle eccezioni dell'utente distinguerebbe tra le due possibili istanze di std::invalid_argument
?
O sto facendo questo sbagliato, e dovrei ereditare da std :: invalid_argument per distinguere tra loro? Cioè,
class InvalidHour: public std::invalid_argument
{
public:
InvalidHour(const std::string& what_arg)
:std::invalid_argument(msg) {};
}
class InvalidMinute: public std::invalid_argument
{
public:
InvalidMinute(const std::string& what_arg)
:std::invalid_argument(msg) {};
}
Poi, gettare InvalidHour
e InvalidMinute
?
Modifica: Creare una classe per ogni possibile eccezione mi sembra un po 'troppo, specialmente in un programma di grandi dimensioni. In questo modo, ogni programma che utilizza in modo efficace le eccezioni viene fornito con un'ampia documentazione su cosa catturare?
Come menzionato in una risposta, ho considerato assert
su. Guardando attorno allo stackoverflow, ho trovato una maggioranza di persone che dicono che dovresti fare un'eccezione (come il mio caso particolare è per un costruttore ).
Dopo aver esaminato un sacco di informazioni online su quando utilizzare le eccezioni, il consenso generale è quello di utilizzare uno assert
per errori logici ed eccezioni per errori di runtime. Sebbene chiamare foo(int, int)
con argomenti non validi potrebbe essere essere un errore di runtime. Questo è ciò che voglio affrontare.
* Idealmente * si dovrebbero avere due tipi, 'Ora' e' Minuto', che generano il proprio tipo di eccezione quando costruiti con valori non validi. – user657267
Sì, sei corretto, dovresti introdurre nuovi tipi se vuoi distinguere tra loro in modo pulito –
* "come un utente sarà in grado di distinguere tra le eccezioni che le mie funzioni possono generare" * ** Perché ** fai bisogno dell'utente/l'utente ha bisogno di distinguere tra questi due casi? 'Pippo' convalida solo i suoi argomenti? – dyp