Učím se c++ a pokud tomu rozumím dobře, tak neočekávaná výjimka nastane pokud funkce vyvolá výjimku a přitom ji nemá ve své specifikaci. Funkcí std::set_unexpected mohu nastavit jaká fukce se bude volat při neočekávané výjimce. Zkoušel jsem takovýto čistě testovací (jinak neaprosto nepoužitelný) kód:
#include <iostream>
#include <exception>
#include <cstdlib>
void myTerminate()
{
std::cerr << "myTerminate\n";
std::cin.get();
std::exit(-1);
}
void myUnexpected()
{
std::cerr << "myUnexpected\n";
std::cin.get();
std::exit(-1);
}
void fce() throw(std::out_of_range)
{
throw std::string("chyba");
}
int main()
{
std::set_terminate(myTerminate);
std::set_unexpected(myUnexpected);
std::cout << "Pred throw.\n";
std::cin.get();
try
{
fce();
}
catch (std::out_of_range e)
{
std::cerr << "catch (std::out_of_range e)\n";
}
catch (...)
{
std::cerr << "catch (...)\n";
}
std::cout << "Za throw";
std::cin.get();
}
Podle mě, by program měl narazit na neočekávanou výjimku a vypsat:
Pred throw
myUnexpected
Toto mi funguje ve C++ Builderu, ale ve MS Visual Studiu 2008 mi to vypíše tohle:
Pred throw
catch (...)
za throw
Přijde mi to jako, že VS2008 nemá vůbec implementové specifikace výjimek u funkcí, a nezjistí tedy neočkávanou výjimku (bere ji jako normální výjimku, kterou zpracují handlery catch).