Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Discussione: [c++ MFC]eccezioni

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++ MFC]eccezioni

    Ciao.
    Sto lavorando ad un progetto per l'importazioni di dati da server com ,e il programma va in crash dando un errore generico.
    E' possibile usare le eccezioni per farsi dire a che funzione si blocca e magari un errore un po piu' esplicativo?
    Come?
    ho provato nel mio progetto a scrivere:
    codice:
    ...
    try{
    double x , y ,res = 0.;
    res=x/y;
    }
    catch(exception e)
    {
      CString strException= CString(e.what());
      AfxMessageBox("errore "+strException);
    }
    ma non rileva l'errore di divisione per 0 e salta il catch.
    Perchè?
    Grazie.

  2. #2
    Il tuo catch cattura solo std::exception. Per catturare anche le sue derivate e per catturare quelle specifiche di MFC, oltre a quelle sconosciute, devi fare un qualcosa del genere:

    Codice PHP:
    try{
        
    // ...
    }
    catch (const 
    std::exception &theSTDException){
        
    // cattura anche le derivate da std::exception
    }
    catch (
    CException theMFCException){
        
    // cattura le eccezioni di MFC
    }
    catch (...){ 
    // osserva che i tre puntini fannno parte del codice
        // cattura le eccezioni non catturate sopra

    vedi anche:
    http://msdn.microsoft.com/en-us/library/t078xe4f(VS.80).aspx

  3. #3
    Già che ci siamo ...
    codice:
    #include <iostream>
    using namespace std;
    
    int main (int argc, char *argv[])
    {
        try
            {
            int x = 1, y = 0 ,res = 0;
            res=x/y;
            }
        catch(exception& e)
            {
            cout << e.what();
            }
        cin.get ();
        return EXIT_SUCCESS;
    }
    Perchè non funziona ?
    Experience is what you get when you don’t get what you want

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    e se invece voglio lanciare un afxmessagebox se una data variabile è 0?
    COme possofare?
    Grazie.

  5. #5
    Una selezione ?
    Experience is what you get when you don’t get what you want

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da Xaratroom
    Perchè non funziona ?
    Perché è una hardware exception sollevata dalla cpu, non dal programma.
    Qui c'è l'articolo sulle Structured Handling Exception.
    http://msdn.microsoft.com/en-us/library/ms680657.aspx

  7. #7
    E' vero ... che idiota che sono...
    Grazie
    Experience is what you get when you don’t get what you want

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    ciao
    ho provato uesto codice ma non mi ritorna l'eccezione:
    codice:
    try{ 
    			double x=0.,y=0.,res = 0.;
    			res=x/y;
    							} 
    		catch (CException * theMFCException){ 
    			AfxMessageBox("1");// cattura le eccezioni di MFC 
    		} 
    		catch (...){ // osserva che i tre puntini fannno parte del codice 
    			AfxMessageBox("2");// cattura le eccezioni non catturate sopra
    }
    eppure divido per 0!

    e anche facendo una boiata del tipo:

    codice:
    int *pp= new int[2];
    int p = pp[200];
    mi da errore senza sollevare l'eccezione.
    Grazie.

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Mi quoto:
    Perché è una hardware exception sollevata dalla cpu, non dal programma.
    Qui c'è l'articolo sulle Structured Handling Exception.
    http://msdn.microsoft.com/en-us/library/ms680657.aspx

  10. #10
    shodan, hai detto una cosa giusta ma incompleta

    semplicemente il tipo di exception è "unsigned long" (o DWORD), ma per essere catturata devi impostare il compilatore con /xSHa (lo trovi nelle Proprietà Progetto, suppongo tu usi Visual c++).

    Per controllare anche le eccezioni di virgola mobile (inclusa la divisione per 0 tra interi, seppure non siano float), devi attivare un'altra flag, la trovi cercando un po' di pagine di proprietà.

    Se sai che dovrai usare solo eccezioni hardware puoi cambiare il codice così:

    codice:
    __try {
         //codice che potrebbe generare eccezioni
    } __except(ExceptionFilter(GetExceptionInformation())) {
         //fa nulla, dato che il grosso è fatto in exceptionfilter
    }
    DWORD ExceptionFilter(EXCEPTION_POINTER* info) {
        LPTSTR message = NULL;
        DWORD flags = FORMAT_MESSAGE_ALLOCATE_BUFFERS|FORMAT_MESSAGE_ARGUMENT_ARRAY;
        if(info->ExceptionRecord->ExceptionCode & 0x40000000) {
             flags = flags | FORMAT_MESSAGE_FROM_HMODULE;
        } else {
             flags = flags | FORMAT_MESSAGE_FROM_SYSTEM;
        }
        FormatMessage(flags,GetModuleHandle(NULL),info->ExceptionRecord->ExceptionCode,0,(LPTSTR)&message,50,(va_list *)info->ExceptionRecord->ExceptionInformation);
        int retval = MessageBox(NULL,message,TEXT("Exception"),MB_ABORTRETRYIGNORE|MB_ICONERROR|MB_TASKMODAL);
        switch(retval) {
              case IDABORT:
                    ExitProcess(-1);
                    return 0; //per alcuni compilatori che si lamentano dell'assenza di valore di ritorno
              case IDRETRY:
                    return EXCEPTION_CONTINUE_EXECUTION;
              case IDIGNORE;
                    return EXCEPTION_EXECUTE_HANDLER;
        }
    }
    Armageddon - Chief Developer

    Stiamo cercando collaboratori!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.