Поймать и изменить std:: исключение и подклассы, повторить один и тот же тип

Я бы хотел сделать так:

try
{
  // ...
}
catch(const std::exception& ex)
{
  // should preserve ex' runtime type
  throw type_in_question(std::string("Custom message:") + ex.what());
}

Возможно ли это, без необходимости писать отдельный обработчик для каждого подтипа?

Ответ 1

То, что вы ищете, вероятно, будет примерно таким:

try {
    // ...
}
template <typename Exc>
catch (Exc const& ex) {
    throw Exc(std::string("Custom message:") + ex.what());
}

По крайней мере, так, как мы обычно будем делать на С++. К сожалению, вы не можете писать код шаблона в блоке catch, подобном этому. Лучшее, что вы можете сделать, это просто добавить некоторую информацию типа времени выполнения в виде строки:

try {
    // ...
}
catch (std::exception const& ex) {
    throw std::runtime_error(std::string("Custom message from ") +
                             typeid(ex).name() + ": " + ex.what());
}