Comment créer des exceptions?

J'ai donc une prochaine cession portant sur les exceptions et les utiliser dans mon carnet d'adresses actuel programme que la plupart des devoirs est centrée autour de. J'ai décidé de jouer avec les exceptions et l'ensemble de try catch chose, et en utilisant une conception de classe, qui est ce que je vais finir par avoir à faire pour mon affectation dans une couple de semaines. J'ai le travail de code permettant de vérifier l'exception tout simplement beau, mais ce que je veux savoir, c'est si il existe un moyen de normaliser mon message d'erreur de la fonction, (j'.e mon ce() call):

S voici mon code:

#include <iostream>
#include <exception>
using namespace std;


class testException: public exception
{
public:
  virtual const char* what() const throw() //my call to the std exception class function (doesn't nessasarily have to be virtual).
  {
  return "You can't divide by zero! Error code number 0, restarting the calculator..."; //my error message
  }

  void noZero();

}myex;  //<-this is just a lazy way to create an object



int main()
{
void noZero();
int a, b;

cout << endl;

cout << "Enter a number to be divided " << endl;

cout << endl;

cin >> a;

cout << endl;

cout << "You entered " << a << " , Now give me a number to divide by " << endl;

cin >> b;

try
{    
    myex.noZero(b); //trys my exception from my class to see if there is an issue
}
catch(testException &te) //if the error is true, then this calls up the eror message and restarts the progrm from the start.
{
    cout << te.what() << endl;
    return main();
}

cout <<endl;

cout << "The two numbers divided are " << (a / b) << endl;  //if no errors are found, then the calculation is performed and the program exits.

return 0;

}

  void testException::noZero(int &b) //my function that tests what I want to check
  { 
    if(b == 0 ) throw myex;  //only need to see if the problem exists, if it does, I throw my exception object, if it doesn't I just move onto the regular code.
  }

Ce que je voudrais être capable de faire c'est donc mon ce() la fonction peut renvoyer une valeur dépend de quel type d'erreur est appelé. Ainsi, par exemple, si je devais appeler une erreur qui ressemblait le plus grand nombre,(un), pour voir si c'était un zéro, et si elle l'était, elle serait alors le message pour dire que "vous ne pouvez pas avoir un numérateur de zéro", mais encore être à l'intérieur de la ce() fonction. Voici un exemple:

  virtual const char* what() const throw() 
  if(myex == 1)
  {
      return "You can't have a 0 for the numerator! Error code # 1 "
  }
  else

  return "You can't divide by zero! Error code number 0, restarting the calculator..."; //my error message
  }

De toute évidence, cela ne fonctionnerait pas, mais est-il un moyen de le faire donc je ne suis pas écrire une fonction différente pour chaque message d'erreur?

  • Pour commencer, appelant main de manière récursive n'est pas légal.
  • noZero nécessité de ne pas (ou ne devraient pas) être un membre à l'intérieur de testException. Déplacer à l'extérieur!
  • L'idée est généralement que vous implémentez une classe distincte pour chaque type d'exception. Chacun d'eux remplace la what() fonctionnent d'une façon différente, et vous êtes évidemment libre d'inclure liées à un type d'information dans la chaîne de caractères qu'elle renvoie.
  • Attendez, créer un classe différente pour chaque erreur? N'est-ce pas sembler un peu exagérer? Pourquoi ne serait-il pas mieux de créer une classe d'exception qui couvre les erreurs de votre recherche d', au lieu fo un tas de catégories distinctes?
  • Ce que j'essaie de voir, c'est que si vous pouvez mettre en œuvre une sorte de variable, éventuellement, à l'intérieur tout ce que vous jetez, qui peut être lu par la ce et ensuite utilisée pour décider lequel d'erreur de retour
  • Non, il n'est pas! Vous disposez d'un module spécifique d'exception générale. Chaque classe d'exception que vous créez, dans ce module, héritent de cette classe d'exception. De cette façon, vous pouvez avoir plusieurs clauses catch, au lieu d'avoir une clause catch et une série de if-else. Aussi vous pouvez avoir le niveau du module exception interceptée, à la fin, si vous ne se soucient quelques exceptions près.
  • Un autre en-tête qui ressemble à ceci: class numZeroExp: public exception { public: virtual const char* what() const throw() { return "You numerator cannot be zero! Error code number 0, restarting the calculator..."; } void numZeroExp::noZero(int &a) { if(a == 0 ) throw myex; } }myex; class denZeroExp: public exception { public: virtual const char* what() const throw() { return "You can't divide by zero! Error code number 0, restarting the calculator"; } void denZeroExp::noZero(int &b) { if(b == 0 ) throw myex2; } }myex2;
  • Fondamentalement, j'ai deux classes, à la fois à l'aide de la valeur par défaut exception appel à ce que(), avec les messages distincts. Est-ce exact?

InformationsquelleAutor Charlie M | 2013-04-24