Когда вы бросаете и необработанный std::runtime_error
терминал автоматически печатает результат what()
делая отладку намного проще. Пример:
#include <iostream>
int main()
{
throw std::runtime_error("This is an error message.\n");
}
Консольный вывод:
terminate called after throwing an instance of 'std::runtime_error'
what(): This is an error message.
Пользовательские классы исключений, полученные этим классом, показывают то же поведение, классы исключений, созданные с нуля, по умолчанию этого не делают.
Но класс исключения, который я хочу создать, не должен быть производным от std::runtime_error
..И для целей отладки, what()
все равно должен быть напечатан после сбоя программы — но я не могу понять, как это сделать, несмотря ни на что! Может кто-то помочь мне, пожалуйста?
На данный момент это выглядит так:
#include <iostream>
struct Custom_Exception
{
std::string Msg;
Custom_Exception(std::string Error_Msg) noexcept
{
Msg=Error_Msg;
}
std::string what() noexcept
{
return Msg;
}
};
int main()
{
throw Custom_Exception("This is an error message.\n");
}
Консольный вывод:
terminate called after throwing an instance of 'Custom_Exception'
нет what():
в сообщении об ошибке … std::cout<<Msg;
в деструктор тоже не помогает.
Пожалуйста, помогите мне с вашими предложениями! Спасибо.
Минимальный интерфейс исключения для использования what()
с std::terminate_handler
является std::exception
:
struct Custom_Exception : public std::exception {
std::string Msg;
public:
Custom_Exception(std::string Error_Msg) noexcept : Msg(Error_Msg) {
}
const char* what() const { return Msg.c_str(); }
};
Еще один вариант без наследования от std::exception
интерфейс должен ловить ваши пользовательские исключения в main()
int main()
{
try {
throw Custom_Exception("This is an error message.\n");
}
catch(const Custom_Exception& ce) {
std::cerr << ce.what() << std::endl;
}
}
или переопределить и установить std::terminate_handler
с вашим собственным обработчиком.
Вы должны получить свое исключение из std :: exception, который предлагает виртуальный деструктор и виртуальный метод what (). Если вы переопределите деструктор, вы сможете распечатать свое сообщение.
#include <iostream>
#include <exception>
class Custom_Exception : std::exception
{
char const* Msg;
Custom_Exception(char const* Error_Msg) noexcept
{
Msg=Error_Msg;
}
Custom_Exception(Custom_Exception const& other)
{
Msg = other.Msg;
}
Custom_Exception& operator=(Custom_Exception const& other)
{
Msg = other.Msg;
return *this;
}
virtual ~Custom_Exception()
{
}
virtual char const* what() const noexcept
{
return Msg;
}
};
int main()
{
try
{
throw Custom_Exception("This is an error message.\n");
}
catch (Custom_Exception& ex)
{
std::cout << "what(): " << ex.what();
}
}