Я изучаю C++, и я испытываю, когда пытаюсь создать собственное исключение и бросить их в Linux.Создание пользовательских исключений в C++
Я создал небольшой тестовый проект для проверки моей реализации, а ниже мой заголовочный файл класса исключения.
class TestClass : public std::runtime_error
{
public:
TestClass(char const* const message) throw();
virtual char const* what() const throw();
};
Исходный файл для класса исключений является
using namespace std;
TestClass::TestClass(char const* const message) throw()
: std::runtime_error(message)
{
}
char const * TestClass::what() const throw()
{
return exception::what();
}
В моем главном приложении, я вызываю функцию, которая бросает мое исключение и ловит его в Try/улове следующим образом:
void runAFunctionAndthrow();
/*
*
*/
int main(int argc, char** argv) {
try
{
cout << "About to call function" << endl;
runAFunctionAndthrow();
}
catch (TestClass ex)
{
cout << "Exception Caught: " << ex.what() << endl;
}
return 0;
}
void runAFunctionAndthrow()
{
cout << "going to run now. oh dear I need to throw an exception" << endl;
stringstream logstream;
logstream << "This is my exception error. :(";
throw TestClass(logstream.str().c_str());
}
Когда я бегу, я ожидал получить следующий вывод:
About to call function
Going to run now. oh dear I need to throw an exception
Exception Caught: This is my exception error. :(
Вместо того, что я получаю
About to call function
going to run now. oh dear I need to throw an exception
Exception Caught: std::exception
Обратите внимание на последней строке говорится станд :: исключение вместо моего фактического сообщения исключений «Это моя ошибка исключение».
Почему это, он работает нормально в Windows, но в Linux он это делает.
Из того, что я видел на разных постах, то, что я сделал, является правильным, так что мне не хватает.
В 'what()' вы, вероятно, имели в виду 'return runtime_error :: what();' - что могло бы полностью исключить повторную реализацию (поведение базового класса здесь уже хорошо для вас). –