[CSProjects] Mesaje de eroare si biblioteci

Razvan Deaconescu razvan at anaconda.cs.pub.ro
Mon Jun 18 13:14:36 EEST 2007


Vlad Dogaru wrote:
> Salut,
> 
> nu am mai scris niciodata o biblioteca. Cum ar trebui sa tratez erorile,
> astfel incat sa poata fi afisate cat mai clar mesajele si locurile unde
> au aparut erori?

This is how I do it:

---
#define DEBUG                   0
#if DEBUG
#define Dprintk(format, ...)    \
         printk (KERN_ALERT "[%s]:%s:%d: " format, __FILE__,     \
                         __func__, __LINE__, __VA_ARGS__)
#else
#define Dprintk(format, ...)
#endif
---

Aici e vorba de module de kernel, unde functia de afisare este printk. 
Se poate generaliza foarte usor la printf.

Poate ca ar fi util un header debug.h care sa contina astfel de 
macro-uri sau functii inline utile.

Poti sa generalizezi la afisarea mesajului de eroare cu perror sau strerror.

> 
> In momentul de faţă am urmatoarea schita de functionare, care este voit
> mult prea generala, pentru ca sugestiile sa fie valabile in toate
> cazurile.
> 
>          fuctia de interfata (1) apeleaza o functie statica (2), iar
>          aceasta, la randul ei, apeleaza o alta functie statica (3).
> 
> Cum as putea sa fac ca un mesaj de eroare in functia 3 sa se
> propage pana la nivelul utilizatorului (pana in stderr), oprind
> rularea functiilor 1 si/sau 2 daca este cazul? Stiu ca asta e o
> problema de exceptii si limbaje de nivel inalt, dar ma gandesc
> ca am vazut lucruri similare si in programe C, mesaje de genul:
> 
>          program: biblioteca: fopen: file not found.
> 
> Planul meu era ca:
> * daca o functie intoarce un pointer, sa intoarca 0 (NULL) la eroare
> * daca o functie intoarce intreg pozitiv sa intoarca -1 la eroare daca o
> * functie e void, sa o fac int si sa intoarca 0 la succes si -1 la
> eroare.
> 
> Problema ar fi unde/daca sa folosesc perror. Daca as folosi in functia
> (1), apoi as intoarce eroare, exista posibilitatea (mare) ca si functia
> externa sa prinda eroarea si sa mai afiseze odata un mesaj similar. E
> asta de dorit?

Si eu ma lovesc des de problema asta. Ai doua solutii:

* o solutie este sa intorci -1 in toate functiile imbricate pana la 
functia mare si in functia asta mare sa afisezi mesajul de eroare in 
ultima functie
* alta solutie este ca la intalnirea unei erori (de obicei critice) sa 
iesi din program: exit (EXIT_FAILURE)

Trebuie, insa, sa ai in vedere faptul ca in cazul unei biblioteci nu 
prea e recomandat sa iesi folosind exit. Trebuie intotdeauna sa te 
intorci din functia exportata cu o eroare, eventual completand 
corespunzator variabila globala errno (la care ai acces incluzand errno.h)

> 
> Daca cineva are un exemplu de cum ar trebui sa arate, as aprecia nespus
> de mult. Daca trebuie sa regandesc problema, va rog indrumati-ma.
> 

Cred ca solutia este sa intorci eroare fara a afisa nici un mesaj de 
eroare in cadrul bibliotecii. Ramane la latitudinea utilizatorului 
bibliotecii sa faca ce vrea el.

Poti codifica intr-un anume fel mesajele de eroare intoarse de 
biblioteca sau poti completa corespunzator variabila errno (read above).

> 
> PS: e frustrant sa ai o varianta incipienta in minte si de fiecare data
> cand te apuci de codat sa te lovesti de lucruri auxiliare, dar pe care
> nu vrei sa le scapi din vedere.

We know that :-)

Razvan



More information about the cspay-dev mailing list