Подтвердить что ты не робот

Пользовательское сообщение об ошибке повторного исключения, не напечатанное каким()

Я пишу набор пользовательских исключений, которые расширяют std::exception. В некотором коде, когда исключение поймано, я просто переписываю цепочку до тех пор, пока функция main драйвера не вызовет вызов catch es и не выведет результат. Однако в конечном итоге все, что печатается, - "std:: exception". Это не проблема вопроса, о которой я говорил ранее.

Почему мои сообщения об исключениях не печатаются?

Мой код исключения:

// General exception class
struct MyException : public std::exception
{
    std::string _msg;

    MyException(const std::string &exception_name) : _msg(exception_name) {}

    void setMessage(const std::string &message)
    {
        _msg += ": " + message + "\n";
    }

    void setLocation(const char * func, const char * file, const int line)
    {
        _msg += "  In function " + std::string(func) + "(" + file + ":" + std::to_string(line) + ")";
    }

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

// Specializations of the MyException
struct FileNotFoundException : public MyException
{
    FileNotFoundException() : MyException("FileNotFoundException") {}
};

struct IOException : public MyException
{
    IOException() : MyException("IOException") {}
};
struct DBException : public MyException
{
    DBException() : MyException("DBException") {}
};

Все мои исключения исключаются, завернутые в этот макрос

#define EXCEPTION_THROWER(ET, message)              \
    {                           \
        ET e;                       \
        e.setMessage(message);              \
        e.setLocation(__func__, __FILE__, __LINE__);    \
        throw e;                    \
    }

и называется

EXCEPTION_THROWER(DBException, "Blah blah database exception")

Промежуточные блоки try/catch выглядят следующим образом:

try
{
    // Call a function that throws an exception
}
catch(const std::exception &e)
{
    throw e; // Forward any exceptions
}

и код драйвера находится в одном блоке try с блоком catch (const std::exception &e).

4b9b3361

Ответ 1

throw e; выполняет загрузку ковша среза объектов, поскольку он, по сути, нарезает все, что e было на std::exception_msg будет быть потерянным).

Используйте throw;, чтобы восстановить захваченное исключение по ссылке.