Utilisation des fonctions de rappel pour la gestion des erreurs en C

Je pensais à la difficulté rencontrée avec la gestion des erreurs C .. comme qui fait réellement

if(printf("hello world")==-1){exit(1);} 

Mais vous enfreignez les normes communes en ne procédant pas à un codage aussi prolixe et inutile. Et si vous aviez un wrapper autour de la libc? comme pour pouvoir faire quelque chose comme ..

 //main... error_catchall(my_errors); printf("hello world"); //this will automatically call my_errors on an error of printf ignore=1; //this makes it so the function will return like normal and we can check error values ourself if(fopen.... //we want to know if the file opened or not and handle it ourself. } int my_errors(){ if(ignore==0){ _exit(1); //exit if we aren't handling this error by flagging ignore } return 0; //this is called when there is an error anywhere in the libc } ... 

J’envisage de faire un tel emballage car je suis en train de synthétiser ma propre libc sous licence BSD (je dois donc déjà toucher l’intouchable ..), mais j’aimerais savoir ce que les gens en pensent .. cela fonctionnerait-il réellement dans la vie réelle et être plus utile que de retourner -1?

Mais comment seriez-vous capable d’attraper l’erreur quand elle était attendue? Par exemple, un fichier ouvert peut échouer et je souhaite le traiter dans le code au lieu du détecteur d’erreur générique.

Pour ce faire, vous aurez besoin de deux versions de chaque fonction. Un qui a piégé des erreurs et un les erreurs de retour.

J’ai fait quelque chose comme ça il y a longtemps sans modifier la bibliothèque. Je viens de créer des fonctions d’encapsulation pour les appels courants qui vérifiaient les erreurs. Donc, mon appel errchk_malloc a vérifié le retour et a généré une erreur en cas d’échec de l’allocation. Ensuite, j’ai juste utilisé cette version partout à la place du malloc intégré.

Au cours de ces dernières années, j’ai vu plusieurs tentatives d’imitation try / catch en ANSI C:

Je pense que cette approche try / catch est plus simple que votre.

si l’objective est de sortir proprement dès que vous rencontrez une erreur, c’est correct … mais si vous voulez effectuer un minimum de récupération d’erreur, je ne vois pas en quoi votre approche est utile …

Pour éviter ce genre de problème, j’utilise parfois LD_PRELOAD_PATH pour intégrer ma gestion des erreurs (uniquement pour mes propres projets car ce n’est pas vraiment une bonne pratique …)

Voulez-vous vraiment changer les comportements standard de votre LIBC? Vous pouvez append quelques extensions autour de fonctions communes.

Par exemple, Gnome utilise g_malloc et g_try_malloc . Le premier abandonnera en cas d’échec, tandis que le second donnera simplement un pointeur nul comme malloc .