Exception Handler Problem



  • Hallo wieso wird hier die Exception nicht ausgelöst ?
    Meine Datei ist größer als 20 Byte.
    Wenn ich das Programm dann die Datei lesen lasse wird der __except Teil einfach übersprungen
    und ich bekomme ein EACCESS Violation

    Ich hab mich hier an diesem Beispiel orientiert: http://msdn.microsoft.com/en-us/library/ms681409(v=VS.85).aspx

    Bei einer Divison durch 0 da funktioniert der Exception Handler aber wieso nicht bei meinem
    ReadFile ?

    ( Ja ich könnte auch einfach prüfen ob ret_size < 20 aber ich wollte mich mal mit exceptions beschäftigen ... )

    #include <iostream>
    #include <windows>
    using namespace std;
    
    BOOL lese( ) ;
    
    int main(int argc, char* argv[])
    {
    
    bool r=0;
    
    r=lese(  ) ;
    
    cout<<endl;
    cout<< "ret: " << r;
    
    system("PAUSE");
            return 0;
    }
    //---------------------------------------------------------------------------
    
    BOOL lese()
    {
    
    HANDLE hfile;
    DWORD nbt=0;
    
    char buf[20];
    
    DWORD ret_size = 0;
    
    hfile =   CreateFile  ( "test.txt", GENERIC_READ , FILE_SHARE_READ , 0,  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 );
    ret_size =  GetFileSize ( hfile , NULL );
    ZeroMemory(buf, 20);
    
        __try
        {
                    ReadFile (hfile  , buf , ret_size  , &nbt , NULL );
        }
    
        // MIt EXCEPTION_ACCESS_VIOLATION anstatt EXCEPTION_STACK_OVERFLOW funktionierte es auch nicht
        __except(GetExceptionCode() == EXCEPTION_STACK_OVERFLOW  ?
                                       EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH )
    
        {
            cout<<"error "<<endl;
            return 0;
        }
    
            MessageBox( 0 , "ok","ok",0);
            cout<< buf << endl;
    
    return 1;
    }
    


  • =Seit wann löst "ReadFile" eine Exception aus?
    Da gibt es einen Rückgabewert und nötigenfalls "GetLastError"...


  • Mod

    Wenn man die gesamte Datei in 20 Bytes lesen will und diese größer ist, dann gibt es schon eine Exception.
    Dein Problem ist, dass Du den Stack überschreibst, aber das muss noch kein Speicher Problem sein, denn wenn dort noch gültiger Stack liegt dann gibt es keine Exception.



  • Naja... Garbage in => Garbage out...
    Eine Exception tritt ja auch nur zufaellig auf, falls der Callstack dies noch hergibt...


Anmelden zum Antworten