Dove sono

Contattami

Address

Abito da qualche parte su questa minuscola sfera nuvolosa. In un pezzo di terra e rocce a forma di stivale, dove l'abitante medio è il furbetto che si lamenta se gli altri fanno i furbetti.

Gestione degli errori in C

Gestione degli errori in C
Jun
22
  • Posted by: Mc128k
  • Date: 2015-06-22
  • In:  Programmazione
  • 0 comments

Scrivo questa ammucchiata di parole per far capire ai pochissimi programmatori alle prime armi che passano di qui come gestire correttamente gli errori in un progetto C.

Non è niente di ufficiale, non seguo uno standard specifico se non quello del buon senso, queste regole le ho inventate per il mio codice, e funzionano piuttosto bene, inoltre permettono di gestire backtrace e pseudo eccezioni.

 

Premessa

 

Il linguaggio C non ha nulla per gestire gli errori, è così aperto che il programmatore deve reinventarsi tutti i paradigmi comuni, error handling compreso. Non esistendo uno standard vero e proprio la gente si sbizzarrisce, fino ad arrivare a tecniche che includono comandi simili a goto, assert male utilizzati e altre corbellerie. Per questa tecnica mi concentro sulla gestione tramite funzioni e return values, come normalmente andrebbe gestita, definendo un tipo di struttura che contiene dettagli sull’errore, una descrizione interna e una adatta ad essere stampata, un collegamento al resto di un eventuale stack per il backtrace. I contenuti sono i seguenti:

     

    • Funzione che ha generato l’errore
    • Codice alfanumerico dell’errore
    • Descrizione per esseri umani
    • Gravità dell’errore (enum)
    • Timestamp
    • Collegamento all’errore che lo ha generato

 

Per creare un errore esiste una funzione apposita che alloca la memoria e si occupa di inserire l’orario, oltre a collegare gli altri errori. Per l’uso basta chiamarla come segue:

 


if((err = db_load_category(database, cur_path)) != NULL) {
closedir(categories_root);
return err_create("db_load_root", "cannot_load_category", "Failed to load from category", MSG_ERROR, err);
}

 

 

Ovviamente si tratta di una ridottissima serie di funzioni create per un programmino che uso per organizzarmi le apps, ma l’idea di base direi che funziona piuttosto bene.

Per affrontare il problema per cui una funzione deve ritornare un valore assieme ad un eventuale errore, consiglio di:

 

– Utilizzare un valore invalido per segnalare un errore che non ha bisogno di una descrizione (per esempio una funzione che ritorna zero quando non può essere un risultato valido vuol dire che ha fallito), questo non permette di avere un backtrace ed è adatto solo per funzioni “capillari”

 

– Scrivere in variabili passate come argomento, quindi passare puntatori a puntatori di variabili come argomenti, scrivere lì e ritornare un errore oppure NULL

 

– Ritornare una struttura dati che contiene il risultato e un eventuale errore

 

Download:

error.c error.h

 

Comments (0)
Leave a Comment