Witam. Może to dość głupie pytanie. Czy jest możliwość w Visual C++ przerwania aplikacji za pomocą wyrzucenia wyjątku przez throw, a potem wyświetlenia MessageBox (np. z WinAPI)?

- Rejestracja:prawie 12 lat
- Ostatnio:23 dni
2
/* #include whatever */
void your_app() { /* whatever */ }
void your_error_msgbox(std::exception const &e) { /* whatever */ }
int main() {
try { your_app(); } catch(std::exception const &e) {
your_error_msgbox(e);
}
return 0;
}
edytowany 2x, ostatnio: spartanPAGE
- Rejestracja:prawie 11 lat
- Ostatnio:około 5 lat
- Postów:243
0
Zrobiłem coś takiego.
try { throw; }
catch(std::exception exc)
{
MessageBox(nullptr, TEXT("Przegrales"), TEXT("You lose"), MB_OK);
}
I to nie działa tak jak chciałem. Wyrzuca mi taki komunikat:
A ja chciałbym, żeby tego komunikatu nie było. Zamiast niego aplikacja ma się przerywać i ma się pojawiać mój MessageBox.
- d84a68b5cf.png (14 KB) - ściągnięć: 121
edytowany 1x, ostatnio: Mikilll

- Rejestracja:ponad 21 lat
- Ostatnio:około 12 godzin
2
kq napisał(a):
Wyjątek C++ i wyjątek systemowy to różne rzeczy. Tutaj masz access violation, czego wewnątrz języka nie złapiesz.
Nieprawda.
#include <stdio.h>
#include <windows.h>
using namespace std;
int main()
{
int *p = nullptr;
try
{
*p = 42;
}
catch(...)
{
printf("Booom!\n");
}
}
Jeżeli jednak nie chcemy catch(...)
, tylko złapać konkretny wyjątek (np. access violation) przegapiając pozostałe, trzeba się trochę bardziej nagimnastykować:
#include <stdio.h>
#include <eh.h>
#include <windows.h>
#include <exception>
using namespace std;
class access_violation: public exception {};
int main()
{
_set_se_translator([](unsigned int u, struct _EXCEPTION_POINTERS*)->void
{
switch(u)
{
case EXCEPTION_ACCESS_VIOLATION:
throw access_violation();
default:
throw exception();
}
});
int *p = nullptr;
try
{
*p = 42;
}
catch(access_violation &e)
{
printf("Booom!\n");
}
}
- seh.PNG (23 KB) - ściągnięć: 117

Takie posty są powodem, żeby na forum przywrócić punkty w dół. Pokazujesz przykład translacji różnych systemów wyjątków i mówisz, że to to samo.

łapie? łapie. nie rozumiem w czym widzisz problem.

Takiej argumentacji można użyć, aby stwierdzić, że
int
i string
to to samo (bo jest std::stoi
).

teraz to bredzisz. napisałeś że wyjątków systemowych nie da się złapać. da się. domyślnie jest to wyłączone, ale z parametrem kompilatora
/EHa
(mówimy o Visualu) zwykły catch(...)
będzie łapał takie rzeczy jak access violation czy dzielenie przez zero. pierwszy pokazany przeze mnie przykład nie ma żadnej magii w kodzie. wewnętrzny mechanizm jak to działa jest nieistotny, to są szczegóły implementacji.