Невозможно поймать std :: invalid_argument в `catch (const std :: exception & ex)` - PullRequest
0 голосов
/ 28 мая 2018

У меня есть следующий код:

void App::start()
try
{
    initialize();
    //...

    m_errorCode = 0;
}
catch (const std::exception &ex)
{
    std::cerr << ex.what() << '\n';
    m_errorCode = -1;
}
catch (...)
{
    std::cerr << "Unknown exception\n";
    m_errorCode = -2;
}

void App::initialize()
{
    m_controller = createController();
    //...
}

std::unique_ptr<IController> App::createController() const
{
    if (m_config.m_controllerType == "iot_v1")
    {
        return std::make_unique<ControllerIotV1>();
    }

    if (m_config.m_controllerType == "iot_v2")
    {
        return std::make_unique<ControllerIotV2>();
    }

    throw new std::invalid_argument("Unsupported controller type.");
}

Я не могу поймать std::invalid_argument в блоке catch (const std::exception &ex).Блок catch(...) запускается вместо этого.Но, насколько я знаю, std::invalid_argument наследуется от std::exception и должен быть перехвачен первым блоком.Это?Я чувствую, что упускаю что-то очевидное.

1 Ответ

0 голосов
/ 28 мая 2018

Вы должны бросить по значению (без new):

throw std::invalid_argument("Unsupported controller type.");
...