Когда вы делаете
throw "something happened"
Вы не бросаете std::exception
. Вы бросаете строковый литерал, который имеет тип const char[N]
. Чтобы поймать его, вам понадобится блок catch типа
catch (const char* e)
{
std::cout << e << std::endl;
}
В качестве альтернативы вы можете выбросить что-то, полученное из std::exception
, например std::runtime_error
и которое будет выглядеть как
void Foo::DoSomething()
{
throw std::runtime_error("something happened");
}
...
catch (const std::exception& e) // catch by reference to const
{
std::cout << e.what() << std::endl;
}
Вы также можете указать обработчик по умолчанию, например
catch (...)
{
std::cout << "something bad happened - cannot recover" << std::endl;
}
, который поймает любое выброшенное исключение, но вы не сможете получить доступ к тому, что было выброшено, поэтому вы можете дать только общее сообщение.