Sto scrivendo una libreria per alcune strutture dati in C che verranno utilizzate nei sistemi embedded. Ho avuto problemi nel progettare e creare un solido piano di gestione degli errori. Questa API è solo soggetta ad errori logici ed è per questo che sono così conflittuale. Con questo voglio dire che le precondizioni potrebbero essere: "x! = NULL" o "indice < dimensione del contenitore".
Facendo molte ricerche sui forum qui, sembra che ci siano diversi approcci per la gestione degli errori in C:
- Usa errno. Credo che il sentimento generale sia errno dovrebbe essere evitato a tutti i costi, e la sua filosofia di design è superata, quindi questo è un no-go.
- Utilizza i codici di errore. Ogni funzione può restituire codici di errore oppure l'utente può passare un puntatore per i codici di errore da assegnare. Credo che restituire codici di errore sia molto più elegante di quest'ultimo, ma alcune funzioni risulteranno goffe perché l'utente dovrà passare un puntatore per ottenere l'output della funzione. Una delle funzioni è "get_index_of_object". Puoi vedere come sarebbe tutto meno che conveniente.
- Usa asserimenti che saranno disabilitati nella produzione di produzione. Questo è quello a cui mi sto proponendo fin d'ora, dal momento che queste strutture di dati saranno utilizzate così spesso, l'aumento delle prestazioni di avere i disertori disabilitati nella creazione di produzione potrebbe essere notevole (anche se non ho dati per supportare questo sin d'ora). Come accennato in precedenza, questa API può essere influenzata solo da errori logici (utenti che non rispettano le precondizioni delle funzioni). Per quanto ne so, si incoraggiano gli errori logici ai fini del debug, ma è buona norma usare gli asserti per convalidare gli argomenti delle funzioni in una API pubblica? Soprattutto quando sarà usato nei sistemi embedded?
- Verifica le condizioni preliminari e torna presto se vengono violate. Il mio più grande problema con questo approccio è il debugging potrebbe essere un incubo per qualcuno anni dopo. Alcune funzioni potrebbero tornare, diciamo "NULL", ma altre come "get_index_of_object" non possono restituire un valore che descriva l'errore.
- Utilizzare una combinazione dei quattro metodi di gestione degli errori di cui sopra. Vorrei evitare il gonfiarsi del codice e mantenere le cose il più comode possibile, ma questa è un'opzione.
Sono curioso di sapere cosa hai da dire.