Итак, у меня есть предстоящее задание, касающееся исключений и использующее их в моей текущей программе адресной книги, в которой сосредоточена основная часть домашней работы. Я решил поиграть с исключениями и всей попыткой поймать вещь и использовать классный дизайн, и это то, что мне в конечном итоге придется сделать для моего задания через пару недель. У меня есть рабочий код, который отлично проверяет исключение, но то, что я хочу знать, - это способ стандартизации моей функции сообщения об ошибке (например, мой вызов()):Как создать исключения?
Здесь мой код:
#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.
}
То, что я хотел бы сделать, это сделать так, чтобы моя функция what() возвращала значение, зависящее от того, какой тип ошибки вызывается. Так, например, если бы я вызывал ошибку, которая выглядела как верхний номер, (а), чтобы увидеть, была ли она нулевой, и если бы это было так, она бы установила сообщение, что «у вас не может быть числитель нуля ", но все еще находится внутри функции what(). Вот пример:
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
}
Это, очевидно, не будет работать, но есть способ сделать это так, я не пишу другую функцию для каждого сообщения об ошибке?
Для начала, вызывая 'main' рекурсивно не является законным. – jogojapan
'noZero' не должен (или не должен) быть членом внутри' testException'. Переместите его наружу! – SuperSaiyan
Идея заключается в том, что вы реализуете отдельный класс для каждого типа исключения. Каждый из них переопределяет функцию 'what()' по-другому, и вы, очевидно, можете включать информацию о типах в возвращаемую строку. – jogojapan