Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Obsługa try ... catch

Ostatnio zmodyfikowano 2013-06-16 15:46
Autor Wiadomość
berkov
Temat założony przez niniejszego użytkownika
» 2013-06-16 12:26:20
Ok, rozumiem.. ale jak Monika doradzila SEH mozna wylapac w nastepujacy sposob:

C/C++
__try
{
    // guarded code
}
__except( expression )
{
    // exception handler code
}


tylko pojawia sie ponownie to samo pytanie czyli co tym razem wpisac w "expression", sciagnalem wiec z podanego przez Monike linka i wpisalem praktycznie to samo uzywajac (po lekkiej modyfikacji dla WINAPI) funkcje filter(...), ktora wyglada u mnie tak:

C/C++
int filter( unsigned int code, struct _EXCEPTION_POINTERS * ep )
{
    MessageBox( 0, "in filter.", 0, 0 );
    if( code == EXCEPTION_ACCESS_VIOLATION )
    {
        MessageBox( 0, "Zlapany.", 0, 0 );
        return EXCEPTION_EXECUTE_HANDLER;
    }
   
    else {
        MessageBox( 0, "Niezlapany.", 0, 0 );
        return EXCEPTION_CONTINUE_SEARCH;
    };
   
}

a teraz wlasciwy kod w ktorym chce wylapac blad:
C/C++
__try {
    LPSTR string =( LPSTR ) GlobalAlloc( GPTR, 1 );
    strcpy( string, "abcdefghijklamnoprst" );
}

__except( filter( GetExceptionCode(), GetExceptionInformation() ) )
{
    MessageBox( 0, "prawdopodobnie przekroczyles ilosc znakow w stringu", "oj nie dobrze", 0 );
}

No i ponownie ten sam problem czyli przy uruchomieniu programu nie dostaje zadnego MessageBox'a a jedynie blad z kompilatora:
 XXX.exe triggered a breakpoint.

Naprawde na to nie ma zadnej metody?
Wiem ze mozna uzyc rozwiazanie zaproponowane przez janakowalksiego ale mi nie tyle chodzi o ten konkretny kod ale o to by miec uniwersalna metode wylapywania bledow w mojej aplikacji, podalem akurat taki przyklad, ktory bedzie pewnie najczestszym bledem.
P-85671
DejaVu
» 2013-06-16 13:20:38
W bloku catch podaje się typ danych jaki ma zostać przechwycony. Jeżeli napiszesz:
C/C++
throw "abc";
to przechwycić chcesz:
C/C++
catch( const char * sTekst )
{
}
Jeżeli chcesz przechwycić liczbę to po prostu piszesz:
C/C++
catch( int liczba )
{
}
Jeżeli chcesz przechwycić jakiś rzucany obiekt, np.
C/C++
throw CObiekt( 1, "komunikat" );
to piszesz:
C/C++
catch( const CObiekt & obiekt )
{
}

Wyjątki służą do obsługiwania zamierzonych i zaplanowanych działań programisty i nie są metodą na zabezpieczenie programu przed niepoprawnym dostępem do pamięci. Nie w C++.
P-85676
xevuel
» 2013-06-16 13:23:19
mi nie tyle chodzi o ten konkretny kod ale o to by miec uniwersalna metode wylapywania bledow w mojej aplikacji
[MSDN] SetUnhandledExceptionFilter
P-85677
berkov
Temat założony przez niniejszego użytkownika
» 2013-06-16 15:44:21
@xevuel, dzieki, o to mi chodzilo. zaraz sproboje odpalic w kodzie.

@DejaVu, teraz juz rozumiem, dzieki.
Dodatkowo pozwole sobie skorzystac z tego ze juz pisze poniewaz zamknales moj drugi watek (zapytanie sumaryczne w SQL) i nie moge juz tam odpisac:
http://cpp0x.pl/forum/temat/?id=11411
mianowicie, bez grupowania takie query nie pojdzie poniewaz nie mozna laczyc agregated funkcji z nieagregated wynikami bo agregated wyrzuci zawsze jeden wynik a nieagregated moze wyrzucic wiecej rzedow.
P-85690
pekfos
» 2013-06-16 15:46:57
Dodatkowo pozwole sobie skorzystac z tego ze juz pisze poniewaz zamknales moj drugi watek (zapytanie sumaryczne w SQL) i nie moge juz tam odpisac:
Jeden problem = jeden temat, a swoje tematy możesz otwierać.
P-85692
1 « 2 »
Poprzednia strona Strona 2 z 2