Attraper Plusieurs Personnalisée Exceptions? - C++
Je suis un étudiant en première programmation en C++ de la classe, et je travaille sur un projet où nous avons de créer de multiples personnalisé des classes d'exception, et ensuite dans l'un de nos gestionnaires d'événements, utiliser un try/catch
bloc à les gérer de façon appropriée.
Ma question est: Comment puis-je reprendre mon plusieurs personnalisé exceptions dans mon try/catch
bloc? GetMessage()
est une méthode personnalisée dans mes classes d'exception qui renvoie l'exception explication comme une std::string
. Ci-dessous j'ai compris tout le code de mon projet.
Merci pour votre aide!
bloc try/catch
//This is in one of my event handlers, newEnd is a wxTextCtrl
try {
first.ValidateData();
newEndT = first.ComputeEndTime();
*newEnd << newEndT;
}
catch (//don't know what do to here) {
wxMessageBox(_(e.GetMessage()),
_("Something Went Wrong!"),
wxOK | wxICON_INFORMATION, this);;
}
ValidateData() La Méthode
void Time::ValidateData()
{
int startHours, startMins, endHours, endMins;
startHours = startTime / MINUTES_TO_HOURS;
startMins = startTime % MINUTES_TO_HOURS;
endHours = endTime / MINUTES_TO_HOURS;
endMins = endTime % MINUTES_TO_HOURS;
if (!(startHours <= HOURS_MAX && startHours >= HOURS_MIN))
throw new HourOutOfRangeException("Beginning Time Hour Out of Range!");
if (!(endHours <= HOURS_MAX && endHours >= HOURS_MIN))
throw new HourOutOfRangeException("Ending Time Hour Out of Range!");
if (!(startMins <= MINUTE_MAX && startMins >= MINUTE_MIN))
throw new MinuteOutOfRangeException("Starting Time Minute Out of Range!");
if (!(endMins <= MINUTE_MAX && endMins >= MINUTE_MIN))
throw new MinuteOutOfRangeException("Ending Time Minute Out of Range!");
if(!(timeDifference <= P_MAX && timeDifference >= P_MIN))
throw new PercentageOutOfRangeException("Percentage Change Out of Range!");
if (!(startTime < endTime))
throw new StartEndException("Start Time Cannot Be Less Than End Time!");
}
Juste un de mes personnalisé des classes d'exception, les autres ont la même structure que celui
class HourOutOfRangeException
{
public:
//param constructor
//initializes message to passed paramater
//preconditions - param will be a string
//postconditions - message will be initialized
//params a string
//no return type
HourOutOfRangeException(string pMessage) : message(pMessage) {}
//GetMessage is getter for var message
//params none
//preconditions - none
//postconditions - none
//returns string
string GetMessage() { return message; }
//destructor
~HourOutOfRangeException() {}
private:
string message;
};
- Ne jetez pas les pointeurs, omettre la nouvelle.
- C'est incroyable de voir votre progression à partir de ce point à maintenant, où vous êtes un top de SORTE que l'utilisateur avec plus de 40k rep. Vraiment génial!
Vous devez vous connecter pour publier un commentaire.
Si vous disposez de plusieurs types d'exception, et en supposant qu'il y a une hiérarchie d'exceptions (et tous les dérivés du public à partir de certains sous-classe de
std::exception
,) commencer par les plus spécifiques et de continuer à le plus général:D'autre part, si vous êtes simplement intéressé par le message d'erreur -
throw
même exception, direstd::runtime_error
avec des messages différents, et puiscatch
que:Rappelez-vous aussi - de le jeter par la valeur prise par [const] référence.
Vous devez créer une base de classe d'exception et l'ensemble de vos exceptions spécifiques en découlent:
Ensuite, vous pouvez attrapez-les tous dans un seul bloc catch:
Si vous voulez être en mesure d'appeler
GetMessage
, vous aurez besoin de:BaseException
, ouGetMessage
une fonction membre virtuelle dansBaseException
et de le remplacer dans chacune des dérivées des classes d'exception.Vous pourriez aussi envisager d'avoir votre exceptions dériver de celui de la bibliothèque standard exceptions, comme
std::runtime_error
et l'utilisation de la idiomatiqueswhat()
fonction de membre au lieu deGetMessage()
.Dérivent toutes de vos exceptions à partir d'une classe de base commune
BaseException
qui a une méthode virtuelleGetMessage()
.Puis
catch(const BaseException& e)
.J'ai eu un problème similaire aujourd'hui, mais il s'est avéré que je n'avais pas besoin de ma solution pour résoudre mon problème. Honnêtement, je ne pouvais pas penser à de véritables cas d'utilisation (exploitation forestière?), et je n'ai pas trouver beaucoup de l'utiliser dans mon code.
De toute façon, c'est une approche de type listes (nécessite le C++11). Je pense que l'avantage de cette approche est qu'il n'y a pas besoin d'avoir une classe de base commune pour la coutume des exceptions (sauf pour les std::exception, peut-être?). En d'autres termes, il n'est pas intrusif à l'exception de la hiérarchie.
Il pourrait y avoir quelques petites erreurs que je ne suis pas au courant de.
catch
.Lorsque les modèles ne peuvent pas, macros sauver la journée.
La solution est extraite de Boost. Elle se résume à 7 lignes de code.
Je rencontre le même problème et voici ce que j'ai:
Dans mon cas, la fonction retourne quand elle n'est pas une exception. Donc je n'ai pas vraiment faire quelque chose à l'intérieur de l'attraper, mais peut faire le travail à l'extérieur de l'essayer.