tôi đang học C++ và tôi đang trải qua khi tôi cố gắng và tạo ra ngoại lệ của riêng tôi và ném chúng trên Linux.Tạo ngoại lệ tùy chỉnh trong C++
tôi đã tạo ra một dự án thử nghiệm nhỏ để kiểm tra việc thực hiện của tôi và dưới đây là ngoại lệ tập tin header lớp học của tôi.
class TestClass : public std::runtime_error
{
public:
TestClass(char const* const message) throw();
virtual char const* what() const throw();
};
Nguồn tập tin cho các lớp ngoại lệ là
using namespace std;
TestClass::TestClass(char const* const message) throw()
: std::runtime_error(message)
{
}
char const * TestClass::what() const throw()
{
return exception::what();
}
Trong ứng dụng chính của tôi, tôi gọi một chức năng mà ném ngoại lệ của tôi và bắt nó trong một try/catch như sau:
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());
}
Khi tôi chạy tôi đang mong đợi để có được kết quả như sau:
About to call function
Going to run now. oh dear I need to throw an exception
Exception Caught: This is my exception error. :(
Thay vì những gì tôi nhận được là
About to call function
going to run now. oh dear I need to throw an exception
Exception Caught: std::exception
Chú ý dòng cuối cùng nó nói std :: ngoại lệ thay vì thông điệp ngoại lệ thực tế của tôi "Đây là lỗi ngoại lệ của tôi".
Tại sao điều này, nó hoạt động OK trên Windows nhưng trên Linux nó thực hiện điều này.
Từ những gì tôi đã nhìn thấy trên bài viết khác nhau những gì tôi đã làm là đúng vì vậy những gì tôi thiếu.
Trong 'what()' bạn có thể có nghĩa là 'return runtime_error :: what();' - sẽ bỏ qua việc thực thi lại hoàn toàn (hành vi lớp cơ sở ở đây đã tốt cho bạn). –