Как я могу вызвать what () после создания необработанного пользовательского исключения?

Когда вы бросаете и необработанный 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; в деструктор тоже не помогает.

Пожалуйста, помогите мне с вашими предложениями! Спасибо.

0

Решение

Минимальный интерфейс исключения для использования 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 с вашим собственным обработчиком.

4

Другие решения

Вы должны получить свое исключение из 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();
}
}
0

По вопросам рекламы [email protected]