Fermer2
deleted2Le 10/11/2014 à 11:54
yop,


Je me demande comment gérer proprement les erreurs d'un programme. Evidemment, j'ai des solutions théoriques, mais elles sont toutes pénibles (sauf une, ne rien gérer grin).

Donc, les deux grandes idées qui me viennent :

1. chaque fonction renvoie ou une valeur particulière (ie NULL si on attend un pointeur) ou un booléen pour dire si elle 'na pas rencontré d'erreur. Ca devient vite monstrueux, parce que chaque appel de fonction où il se passe la moindre allocation, ou le moindre appel de lib, prend tout de suite 4 lignes, au niveau source c'est franchement moche, pénible à écrire et difficile à lire.

2. on utlise setjmp/longjmp. Pour pas trop se pourrir la vie comme dans la première méthode, on n'en fait qu'un dans main (), qui constitue donc un catchall. Problème, si A() appelle B() qui appelle C() qui ...., et que Z() fait un longjmp, tout ce qui aura commencé à être initialisé/alloué/ouvert dans les fonctions A-Y sera perdu.

3. on utilise des listes pour stocker tous les types de données ouverts. Par exemple, si mon programme utilise intensivement des textures, j'ai un objet qui a une liste de toutes mes textures, et qui sera en mesure de tout libérer en cas de souci. Mais ça fait multiplier les listes de ci et ça.


Donc, les avantages :
1 permet de ne pas égarer la moindre ressource en cas d'erreur fatale
2 permet de programmer de manière très simple, parce que basiquement, on ne vérifie rien, un un catchall s'occupe de nettoyer tout ce qu'il peut
3 permet de ne rien perdre

MAIS :
1 est dur à lire, pénible à implémenter, parce que tous les appels de fonctions peurvent échouer : gestion d'erreur tous les trois lignes
2 vous assure de perdre quelques données dans la nature en cas de problème (mais est-ce réellement grave avec un kernel moderne ??)
3 vous oblige à implémenter une multitude de petits objets (vive les "templates" en C, _Generic et autres joyeusetés au passage \o/), et au final vous vous retrouvez avec un code aussi crade qu'en 1 (tous les appels qui créent des ressources sont vérifiés)


Et vous, comment faites-vous ? Est-ce que, tout simplement, vous vous prenez pas la tête, vous codez à coup d'assert et vous faites un abort si ça déconne ici ou là ? grin