Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di Kreator
    Registrato dal
    May 2002
    Messaggi
    278

    [c++] Chiarimento sulle eccezioni

    Ciao raga.

    Volevo avere una delucidazione su come vengono gestite le eccezioni.
    Consideriamo il seguente esempio:

    codice:
    void __fastcall TForm1::ButtonClick1 (TObject *Sender)
    {
       int i=0;
       try
       {
          ...
          ...
       }
       catch (...)
       { 
          ShowMessage ("Eccezione");
       }
       i++;
    }
    Per ipotesi: se all'interno del blocco TRY si genera un'eccezione so per certezza che l'esecuzione del programma si sposta subito sul blocco CATCH(...), quindi viene mostrato un messaggio ...

    La domanda e': dopo aver eseguito la ShowMessage, l'esecuzione del programma continua con (i++) oppure viene terminata tempestivamente la procedura Button1Click demandando al chiamante il controllo ???

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,313

    Re: [c++] Chiarimento sulle eccezioni

    Originariamente inviato da Kreator
    Volevo avere una delucidazione su come vengono gestite le eccezioni. [...]
    La domanda e': dopo aver eseguito la ShowMessage, l'esecuzione del programma continua con (i++) oppure viene terminata tempestivamente la procedura Button1Click demandando al chiamante il controllo ???
    La presenza di un blocco try...except di fatto gestisce l'eccezione e quindi la "assorbe": il programma prosegue nella prima istruzione che segue il blocco stesso.

    Nel tuo caso, se usi un compilatore con ottimizzazione, è possibile che tu non riesca a verificare il valore della variabile i poichè non viene utilizzata successivamente.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di Kreator
    Registrato dal
    May 2002
    Messaggi
    278
    sostanzialmente se io dentro il blocco CATCH(...) gli pongo l'istruzione: throw Exception("Rilancio eccezione");
    Sostanzialmente l'istruzione successiva i++ non viene eseguita vero ?

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,313
    Originariamente inviato da Kreator
    sostanzialmente se io dentro il blocco CATCH(...) gli pongo l'istruzione: throw Exception("Rilancio eccezione");
    Sostanzialmente l'istruzione successiva i++ non viene eseguita vero ?
    Esatto: nel blocco catch hai la possibilità di "rilanciare" l'eccezione che si è verificata, oppure sollevarne una differente, con il risultato che l'istruzione successiva ad essere eseguita sarà la prima inclusa nel blocco catch che si incontra risalendo nello stack delle chiamate.

    In C++Builder, ad esempio, in mancanza di un costrutto try...catch, interviene il blocco di gestione dell'errore predefinito incorporato nel thread che elabora la coda dei messaggi che si limita a visualizzare un messaggio a video.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Originariamente inviato da Kreator
    sostanzialmente se io dentro il blocco CATCH(...) gli pongo l'istruzione: throw Exception("Rilancio eccezione");
    Sostanzialmente l'istruzione successiva i++ non viene eseguita vero ?
    tipo
    codice:
    try{
    ..
    }catch{
    ..
    throw();
    ..
    }
    i++
    no, i++ non viene eseguita, la throw nel catch lancia un eccezione che deve essere catturata in un livello piu' alto

    la gestione delle exception avviene "ad albero" per cui l'eccezione risale tutti i nodi padre finche' non viene gestita.

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.