Cloud with rain
.:G
G:.
0 and 1 serie, black on white
pulled card
myjsp.feelinglinux.com
ver. 1.1.9-4
Hallo, welcome to my world.
Here you can find some stuff about computer science.
<<< Enjoy your visit! >>>
0 and 1 serie, white on black

Gestione degli errori (semplice esempio in C)

        Scritto: Giansante Gabriele, 2001     

Molte funzioni delle librerie C sono strutturate in modo da restituire un valore particolare in caso di errore. Ad esempio, la funzione "open" che apre un file o piu' generalmente un flusso, restituisce il valore "-1" in caso di errore. La funzione "open" non e' la sola ad avere questo comportamento.
Pubblicita'

Per questa classe di funzioni, il codice rappresentante il tipo di errore viene inserito nella variabile "errno" definita nel file "errno.h". Normalmente e' consigliabile, in caso di errore, controllare immediatamente questo valore, per evitare che venga sovrascritto.
Esistono funzioni che si occupano gia' della traduzione da codice (errno) a messaggio ("perror", in stdio.h, produce un messaggio sullo standard error output; "strerror", in string.h, restituisce una stringa contenente il messaggio relativo al codice di errore pasasto come argomento; ecc.).
A volte pero' si vuol avere una gestione personalizzata dei messaggi di errore, tipicamente restituendo testi diversi da quelli standard.
L'idea alla base della routine che sto per mostrare e' quella di passare il risultato "r" della funzione chiamata, di cui si vuole verificare il tipo di errore, ad un'altra funzione che elabori il valore di "errno" solo nel caso in cui "r=-1".
In quest'esempio si assumera' che, l'azione da compiere per ogni tipo di errore, sia una semplice stampa di un messaggio di errore. La parte noiosa sta nell'andare a scoprire, grazie all'aiuto del manuale fornito con il linux, i vari codici di errore delle funzioni da controllare.
Dopo aver mostrato il codice, utilizzabile e modificabile a piacere, ne daro' una piccola descrizione.

  #define  ERR1 "Messaggio di errore 1"
  #define  ERR2 "Messaggio di errore 2"
  ...
  #define  EXIT_SOCKET  1
  #define  EXIT_FILE  2
  ...
  #define  EXIT_STANDARD 50 //Il numero 50 e' casuale

  //Visualizza in modo particolare la stringa ricevuta come parametro.
  void DisplayMessage(char* s)
  {
    //Esempio di stampa:
    //Errore:
    //Questo e' un errore!
    printf("Errore:\n %s",s);
    return;
  }
  //Visualizza un messaggio di errore mediante 
  //la funzione DisplayMessage.
  //Esempio di utilizzo: DisplayCError(fopen(<parametri>));
  void DisplayCError(int res)
  {
    if (res==-1)
    {
       //Se res vale -1, allora, in base ad errno, produco un messaggio
       //di errore
       switch (errno)
       {
         case EPROTONOSUPPORT:{DisplayMessage(ERR1);exit(EXIT_SOCKET);break;}
         case ENFILE:
         case EMFILE:{DisplayMessage(ERR2);exit(EXIT_SOCKET);break;}
         ...
         default:{DisplayMessage(strerror(errno));exit(EXIT_STANDARD);break;}
       }
    }
    return;
  }

La funzione principale e' la "DisplayCError" che si occupa di verificare la correttezza del risultato della chiamata ad una funzione (res==-1 significa che c'e' stato un errore).
In caso di errore, il controllo passa alla struttura condizionale switch che stampa il messaggio opportuno (definito nelle macro ERRn) ed esce dal programma, fornendo al sistema un codice con significato stabilito dalle macro EXIT_xyz.
E' da notare come, nel caso di errori di cui non si voglia modificare il testo standard, venga usata la funzione "strerror" (vedi caso "default" all'interno dello switch).


Hai trovato utile questo articolo?
Aiutami a condividerlo o metti un "mi piace".
Grazie mille!


Gli strumenti di condivisione (Google+, Facebook) sono visibili in alto a destra solo dopo aver accettato la policy di utilizzo dei cookie per questo sito.
FAQ - Come faccio a cambiare la mia scelta?

 

Strumenti (myjsp.feelinglinux.com)
Gioco: allenamento con la tastiera Strumenti di codifica/decodifica URI (%-encoding) e Base64 Strumenti di calcolo online per IP e Reti
QUIZ GAME
Quiz game

Cerca @myjsp.feelinglinux.com

Pubblicita'