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 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()? 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 |
|
MrPoxipol |
» 2013-06-14 16:22:14 |
|
Mrovqa |
» 2013-06-14 18:57:38 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 ) { } catch( char * str ) { } catch(...) { }
Powinno się rzucać wszystkim, co jest lub dziedziczy po std::exception (patrz dokumentacja). |
|
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 |
catch( przekroczenieWymiaru ) { cout << "przekroczono wymiar"; return error1; } catch( Stan obiekt ) { cout << "przekroczono wymiar"; return error1; } catch( Stan & obiekt ) { cout << "przekroczono wymiar"; return error1; } |
|
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. 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.aspxniżej: W MSVC można złapać SEH za pomocą catch (...) zależnie od opcji kompilacji. |
|
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: 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"? |
|
jankowalski25 |
» 2013-06-15 14:22:42 Możesz zrobić to prościej (bez wyjątków): 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 ); |
|
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ć? |
|
« 1 » 2 |