Autor Wątek: Przechwycenie błędu tworzenia Renderer'a  (Przeczytany 1977 razy)

Offline kwonitf

  • Użytkownik

# Maj 26, 2014, 13:41:14
Tworzę sobie Renderer'a w taki sposób:
try
{
SDL_Renderer* renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);
}
catch (...)
{
std::cout << SDL_GetError() << std::endl;
}

Podczas tego tworzenia wyskakuje mi okno z wyjątkiem:
Unhandled exception at 0x6C8037BE (SDL2.dll) in Test.exe: 0xC0000005: Access violation reading location 0x00000010.

i tu moje pytanie, dlaczego nie łapie tego ten catch?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Malkavian Ass...

  • Użytkownik

# Maj 26, 2014, 13:42:47
Bo wyjątek występuje w innym miejscu?

Offline kwonitf

  • Użytkownik

# Maj 26, 2014, 13:45:44
Nie. Zatrzymuje się na tej linijce w try.
Jka zmienię z SDL_RENDERER_ACCELERATED na SDL_RENDERER_SOFTWARE to wyjątek nie leci.
To na 100% ta linijka wywala program.

Offline Malkavian Ass...

  • Użytkownik

# Maj 26, 2014, 14:37:04
Ach, sorry - to Access Violation, C++ raczej nie rzuca swojego wyjątku przy AV.

Offline kwonitf

  • Użytkownik

# Maj 26, 2014, 14:39:45
Niewiele mi to mówi.
Mogę się przed tym jakoś zabezpieczyć?


Offline lethern

  • Użytkownik

# Maj 26, 2014, 14:50:30
Spróbuj z tym, ciekawi mnie czy Ci pomoże,
catch( std::runtime_error& e) {
... e.what()
}

PS widzę że może być potrzebne to http://stackoverflow.com/a/8234956
« Ostatnia zmiana: Maj 26, 2014, 15:05:36 wysłana przez lethern »

Offline kwonitf

  • Użytkownik

# Maj 26, 2014, 14:53:50
Niestety nie pomaga. Nadal to samo

Offline Xion

  • Redaktor
    • xion.log

  • +1
# Maj 26, 2014, 21:31:51
Access violation / segmentation fault to nie jest wyjątek C++, dlatego `catch` (nawet `catch (...)`) go nie łapie. Jeśli koniecznie chcesz go obsługiwać (rada: prawie na pewno nie chcesz), możesz to zrobić w sposób zależny od systemu. Pod Windows jest to Structured Exception Handling, a pod *niksami sygnały (w tym przypadku SIGSEGV).