[c] exception en c (simuler try, catch, throw)

Soyez le premier à donner votre avis sur cette source.

Vue 13 951 fois - Téléchargée 432 fois

Description

Et bien en C console, c'est bien de faire des fonctions qui ne renvoient pas NULL a tout va mais des valeurs importantes.
Donc try, catch(exception_reconnues) pour les appels et throw dans les fonctions.
Ceci est construit grace à une pile qui gère les contextes imbriqués, et au header <setjmp> qui propose les exceptions en C.
Il suffit d'inserer le code dans des macros pour simuler try ect...

Un exemple dans le zip...

Source / Exemple :


// je mets juste la spécification ici

#ifndef _C_EXCEPTION_H_
#define _C_EXCEPTION_H_

#include <setjmp.h>

// Exceptions reconnues

#define NO_EXCEPTION         0			// Code sans erreur
#define ARRAY_EXCEPTION	     99			// Erreur de tableau
#define DIVZERO_EXCEPTION    100		// Erreur de division par 0
#define OVERFLOW_EXCEPTION   101		// Erreur d'overflow

// Pile de contexte

typedef struct contextException
{
	jmp_buf context;
	struct contextException* head;

}Exception;

extern Exception* g_exceptions;

// Prototypes

void push_exception(void);
void pop_exception(int);

// Macros simulant try, catch, throw

#define Try { \
			int exc; \
			push_exception(); \
			exc = setjmp(g_exceptions->context); \
			switch(exc) { \
			case NO_EXCEPTION:

#define Catch(X) \
				 break; \
				 case (X): \
				 exc = 0;

#define EndTry \
			   break; \
			   default: \
			   pop_exception(exc); } \
			   }

#define Throw(X) longjmp(g_exceptions->context, X)

#endif//_C_EXCEPTION_H_

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
24
Le setjmp renvoi 0 au premier passage et marque le point de départ du contexte.
Sans setjmp(), pas de longjmp().
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
Je pense que tu devrais empêcher l'utilisateur d'avoir un accès direct à la classe exception et au push/pop. En C++ je fais ça avec des namespaces, ici tu pourrais simplement mettre ça dans un autre header ...
ça n'empêche pas de les employer certes, mais ça les cache.

je n'ai pas compris à quoi servait le setjmp ?

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.