|
||
| [IT] Gestione degli errori (semplice esempio in C) | ||
|
Gestione degli errori (semplice esempio in C) 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. 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).
|
||
(c) 1999-2006
|