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
[C++] Obsługa try ... catch
» 2013-06-14 16:13:45
Hey ho.

Mam pytanie dotyczase try-catch.
Niby super dokumentacja:
http://msdn.microsoft.com/en-us/library/vstudio/0yd65esw.aspx

ale co mam wpisac do "(IOException e)" bo za cholere nie moge polapac co autor ma na mysli.

zalozmy ze mam przyklad
C/C++
LPSTR string =( LPSTR ) GlobalAlloc( GPTR, 1 );
strcpy( string, "abcdefghijklamnoprst" );

Aplikacja wyrzuci mi blad poniewaz w stringu nie bedzie miejsca na tyle znakow.
Jak moge wylapac ten blad przez try-catch? skad mam wiedziec co mam wpisac w catch()?

C/C++
try {
    LPSTR string =( LPSTR ) GlobalAlloc( GPTR, 1 );
    strcpy( string, "abcdefghijklamnoprst" );
}
catch( COWPISAC e )
{
    MessageBox( 0, "przekroczyles ilosc znakow w stringu", "oj nie dobrze", 0 );
}


Fajnie by bylo gdyby system dal mi jeszcze jakies dodatkowe info o bledzie, rozumiem ze bedzie to ukryte pod zmienna "e" w moim pryzpadku, ale jak to pozniej wykorzystac no i przede wszystkim skad wiedziec jakie IOException  uzyc?

Zazwyczaj dokuemntacja jest dla mnie klarowna ale w tym konretnym przypadku chyba cos musialem ominac bo jej poprostu nie rozuiem, wiec prosze o naprowadzenie.


dzieki
b
P-85560
MrPoxipol
» 2013-06-14 16:22:14
P-85562
Mrovqa
» 2013-06-14 18:57:38
C/C++
try
{
    switch( rand() % 5 )
    {
    case 0: throw 1;
    case 1: throw 'h';
    case 2: throw "destylarka  w sasiada";
    case 3: throw 46.364;
    case 4: throw moja_klasa( 54, "argumenty", konstruktora );
    }
}
catch( int a ) // lapiemy inta (przez jego wartosc)
{
    // ...
}
catch( char * str ) // lapiemy c-string
{
    // ...
}
catch(...) // wylapuje cala reszte == wyjatek nieznany
{
    // ...
}
Powinno się rzucać wszystkim, co jest lub dziedziczy po std::exception (patrz dokumentacja).
P-85579
mostrom
» 2013-06-14 22:59:21
W każdej klauzuli catch jest podany - ujęty w parę nawiasów - typ obsługiwanego przez nią wyjątku. Kod obsługi wyjątku jest umieszczony wewnątrz nawiasów klamrowych
Klauzula catch składa się z trzech części: słowa kluczowego catch, deklaracji jednego typu lub DEKLARACJI jednego obiektu ujętej w parę nawiasów okrągłych oraz instrukcji złożonej

C/C++
catch( przekroczenieWymiaru ) { cout << "przekroczono wymiar"; return error1; }
catch( Stan obiekt ) { cout << "przekroczono wymiar"; return error1; }
catch( Stan & obiekt ) { cout << "przekroczono wymiar"; return error1; }

P-85615
Monika90
» 2013-06-15 07:53:16
Niby super dokumentacja:
http://msdn.microsoft.com/en-us/library/vstudio/0yd65esw.aspx
Ta dokumentacja dotyczy C#. Pomimo podobnej do C++ nazwy, to inny język.

C/C++
LPSTR string =( LPSTR ) GlobalAlloc( GPTR, 1 );
strcpy( string, "abcdefghijklamnoprst" );

To jest UB, czyli niezdefiniowane zachowanie. I takie coś raczej nie powoduje zgłoszenia wyjątku C++. Może za to w Windows rzucić wyjątkiem typu SEH, ale też nie musi. Wyjatków SEH nie można wyłapać za pomocą try catch (ale patrz niżej), za to można je wyłapać za pomocą __try __except
http://msdn.microsoft.com/en-us/library /s58ftw19%28v=vs.110%29.aspx

niżej: W MSVC można złapać SEH za pomocą catch (...) zależnie od opcji kompilacji.
P-85624
berkov
Temat założony przez niniejszego użytkownika
» 2013-06-15 12:31:06
Dzieki wszystkim za pomoc ale wasze odpowiedzi dotycza sie glownie std:: i troche srednio odpowiadaja na moje pytanie.
moze przerobmy to na moim konkretnymn przykladzie:

C/C++
try {
    LPSTR string =( LPSTR ) GlobalAlloc( GPTR, 1 );
    strcpy( string, "abcdefghijklamnoprst" );
}
catch( COWPISAC e )
{
    MessageBox( 0, "przekroczyles ilosc znakow w stringu", "oj nie dobrze", 0 );
}



innyi slowy co wpisac w "COWPISAC"?
P-85626
jankowalski25
» 2013-06-15 14:22:42
Możesz zrobić to prościej (bez wyjątków):
C/C++
CONST SIZE_T size = 1;
LPCSTR lpData = "abcdefghijklamnoprst"
LPSTR string =( LPSTR ) GlobalAlloc( GPTR, size );
if( lstrlen( lpData ) >= size ) MessageBox( 0, "przekroczyles ilosc znakow w stringu", "oj nie dobrze", 0 );
else lstrcpy( string, lpData );
P-85630
m4tx
» 2013-06-15 15:00:18
innyi slowy co wpisac w "COWPISAC"?
Post wyżej masz przecież łopatologicznie napisane że to, co dałeś nie powoduje (a przynajmniej nie musi) rzucenia wyjątku. Co Ty chcesz więc łapać?
P-85631
« 1 » 2
  Strona 1 z 2 Następna strona