Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Catchare eccezioni C++
Forum - C/C++ - Catchare eccezioni C++

Avatar
Luk3 (Ex-Member)
Guru


Messaggi: 615
Iscritto: 16/08/2008

Segnala al moderatore
Postato alle 21:36
Sabato, 13/09/2008
Hi all!
Mi spiegate come catchare un eccezione in C++?
Questo è il mio codice per adesso:
Ditemi se ci sn altri errori in caso :rotfl:

Codice sorgente - presumibilmente C++

  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <fstream.h>
  4.  
  5. using namespace std;
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9.     char nome[100];
  10.     char cognome[100];
  11.     char telefono[100];
  12.     char cellulare[100];
  13.     char email[100];
  14.     char note[10000];
  15.     char percorso[3000];
  16.     char scelta;
  17.     start:
  18.     cout<<"\t---------------------------------------"<<endl;
  19.     cout<<"\t|            Rubrica                  |"<<endl;
  20.     cout<<"\t| 1. Nuovo                            |"<<endl;
  21.     cout<<"\t| 2. Leggi                            |"<<endl;
  22.     cout<<"\t| 3. Esci                             |"<<endl;
  23.     cout<<"\t---------------------------------------"<<endl;
  24.     cout<<"\nInserisci la tua scelta:\n"<<endl;
  25.     cin>>scelta;
  26.     if(scelta == '1')
  27.     {
  28.         cout<<"\nInserisci nome:\n"<<endl;
  29.         cin>>nome;
  30.         cout<<"\nInserisci cognome:\n"<<endl;
  31.         cin>>cognome;
  32.         cout<<"\nInserisci telefono:\n"<<endl;
  33.         cin>telefono;
  34.         cout<<"\nInserisci Cellulare:\n"<<endl;
  35.         cin>>cellulare;
  36.         cout<<"\nInserisci eMail:\n"<<endl;
  37.         cin>>email;
  38.         cout<<"\nInserisci Note:\n"<<endl;
  39.         cin>>note;
  40.         cout<<"\nInserisci ora il percorso del file, compreso di nome ed estensione (*.txt):\n"<<endl;
  41.         cin>>percorso;
  42.         try
  43.         {
  44.         ofstream out(percorso, ios::app);
  45.         out<<nome<<endl;
  46.         out<<cognome<<endl;
  47.         out<<telefono<<endl;
  48.         out<<cellulare<<endl;
  49.         out<<email<<endl;
  50.         out<<note<<endl;
  51.         out.close();
  52.         cout<<"\nFile salvato!\n"<<endl;
  53.         goto start;
  54.         }
  55.         catch
  56.         {
  57.         cout<<"\nErrore durante il salvataggio.\n"<<endl;
  58.         goto start;
  59.         }
  60.     }
  61.  
  62.     if(scelta == '2')
  63.     {
  64.  
  65.     }
  66.  
  67.     if(scelta == '3')
  68.     {
  69.         return 0;
  70.     }
  71.  
  72.  
  73.     return 0;
  74. }


PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 12:02
Domenica, 14/09/2008
Il grave errore semantico che vedo è quello di usare il goto... che esiste, ma non dovrebbe mai essere usato al fine di una buona programmazione.


Il mio blog: https://piero.dev
PM Quote
Avatar
Luk3 (Ex-Member)
Guru


Messaggi: 615
Iscritto: 16/08/2008

Segnala al moderatore
Postato alle 14:36
Domenica, 14/09/2008
Testo quotato

Postato originariamente da pierotofy:

Il grave errore semantico che vedo è quello di usare il goto... che esiste, ma non dovrebbe mai essere usato al fine di una buona programmazione.



Già, me lo dicono tutti... però in C++ non sono granchè...

PM Quote
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 19:00
Mercoledì, 24/09/2008
per gestire un'eccezzione puoi usare il costrutto try{
//codice che può produrre errore
}
catch(tipo variabile){
//gestione errore
}

invece per lanciarla:
throw "stringa";

esempio:
int Divide(int a, int b) {
if (b) return a/b;
throw "Divisione per zero";
}

Per evitare i goto potresti usare una o più funzioni.

PM Quote
Avatar
gioser (Normal User)
Pro


Messaggi: 111
Iscritto: 03/10/2008

Segnala al moderatore
Postato alle 14:12
Lunedì, 06/10/2008
Aggiungo un esempio di uso di una classe per rappresentare l'eccezione:

Codice sorgente - presumibilmente C#

  1. #include <iostream>
  2.  
  3. class EccezioneDivisionePerZero
  4. {
  5. public:
  6.     EccezioneDivisionePerZero(double dividendo) :
  7.         m_dividendo(dividendo)
  8.     {
  9.     }
  10.  
  11.     void Stampati()
  12.     {
  13.         using namespace std;
  14.         cerr << "Errore divisione per zero di " << m_dividendo << endl;;
  15.     }
  16.  
  17. private:
  18.     double m_dividendo;
  19.     std::string m_messaggio;
  20. };
  21.  
  22.  
  23. double dividi(double d1, double d2)
  24. {
  25.     if (0.0 == d2)
  26.         throw EccezioneDivisionePerZero(d1);
  27.     else
  28.         return d1 / d2;
  29. }
  30.  
  31. int main()
  32. {
  33.     using namespace std;
  34.     double d;
  35.     try
  36.     {
  37.         d = dividi(10.0, 2.0);
  38.         cout << "la prima divisione fa " << d << endl;
  39.         d = dividi(10.0, 0.0);
  40.         cout << "la seconda divisione fa " << d << endl;
  41.     }
  42.     catch (EccezioneDivisionePerZero ex)
  43.     {
  44.         ex.Stampati();
  45.         return 100;
  46.     }
  47.     return 0;
  48. }


PM Quote