Zainspirowany moim wcześniejszym tematem https://4programmers.net/Forum/C_i_C++/353621-przekazywanie_inteligentnych_wskaznikow_i_noexcept i odpowiedzią @alagner próbuję wykryć, gdzie rzucany jest wyjątek w moim programie. W jaki sposób najprościej to zrobić na linuxie(jak wygenerować stacktrace)? Czy da się debugować taki throw
jeśli nie mogę uruchomić programu, bo na przykład jest to sterownik układu napędowego rakiety Starship i musiałbym wystrzelić ją w kosmos? Kod oczywiście napisany w celach naukowych, proszę bez czepialstwa.
#include <iostream>
#include <random>
void fun(bool test) noexcept
{
if (test)
throw;
}
int main()
{
std::random_device dev;
std::mt19937 rng(dev());
std::uniform_int_distribution<std::mt19937::result_type> dist(0, 1);
try
{
fun(dist(rng));
fun(dist(rng));
fun(dist(rng));
}
catch (const std::exception& e)
{
std::cerr << e.what() << '\n';
}
std::cout << "KONIEC\n";
}
EDIT:
Czemu w takim przypadku catch nie łapie wyjątku i program nie kończy się prawidłowo?
#include <iostream>
#include <random>
void fun(bool test) noexcept(false)
{
if (test)
throw;
}
int main()
{
std::random_device dev;
std::mt19937 rng(dev());
std::uniform_int_distribution<std::mt19937::result_type> dist(0, 1);
try
{
fun(dist(rng));
fun(dist(rng));
fun(dist(rng));
}
catch(...){}
std::cout << "KONIEC\n";
}