Автоматически добавлять префикс к пользовательскому исключению

Я довольно сомнительный, когда дело доходит до C ++ std: обработка исключений. Вот пример кода, который я нашел в Интернете, который я сейчас использую.

class MyBaseException : public std::exception
{
public:

explicit MyBaseException(const std::string & message)
: m_Base(message.c_cstr()) {}

explicit MyBaseException(const char *message)
: m_Base(message) {}

virtual ~MyBaseException() throw () {}

protected:
typedef std::exception m_Base;
};

class MyDerivedException : public MyBaseException
{
public:

explicit MyDerivedException (const std::string & message)
: m_Base(message.c_cstr()) {}

explicit MyDerivedException (const char *message)
: m_Base(message) {}

virtual ~MyDerivedException () throw () {}

protected:
typedef MyBaseException m_Base;
};

Теперь я хотел бы автоматически добавить все исключения, возникающие по следующей схеме.

Некоторый код вызывает исключение MyDerivedException со следующим:
«Original_exception_message»

Когда MyDerivedException получит «original_exception_message», я хотел бы добавить к нему:
«Получено исключение возбуждено:»

И когда MyBaseException получает исключение MyDerivedException, я хотел бы добавить его:
«Возникло базовое исключение:»

Так что итоговое сообщение будет выглядеть так:

«Возникло базовое исключение: получено производное исключение: original_exception_message»

Я чувствую, что получу всевозможные неприятные ответы об этом, о плохих концепциях и плохих практиках … Но я не претендую на звание эксперта.

Обратите внимание, что сообщения prepend на самом деле не такие. Они были бы немного более информативными.

Заранее спасибо.

3

Решение

#include <iostream>
#include <exception>

class MyBaseException : public std::exception
{
public:
explicit MyBaseException(const std::string & message)
: m_message("Base Exception Raised: " + message) {}

virtual const char* what() const throw ()
{
return m_message.c_str();
}

private:
const std::string m_message;
};

class MyDerivedException : public MyBaseException
{
public:

explicit MyDerivedException (const std::string& message)
: MyBaseException("Derived Exception Raised: " + message) {}

};

int main()
{
try
{
throw MyDerivedException("derived");
}
catch(std::exception const& e)
{
std::cout << e.what();
}
return 0;
}

И читать эту ссылку http://en.cppreference.com/w/cpp/error/exception

1

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

Других решений пока нет …

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