Prototype
enum ECLAT_RETURN { erOk = 0,
 
erPtrNull = 100,
erNew ,
 
erMemAlloc = 200,
erMemAreaOut ,
erMemAreaRide ,
};

Lorsque une fonction retourne une valeur de type E_RTN (qui est une variable de type long) elle correspond à l'une de celles ci-dessus.

 

erOk = 0

La valeur erOk (soit 0) indique qu'il n'y a pas d'erreur.

Vous pouvez utiliser la macro eOk pour simplifier la rédaction (définie dans le fichier eclat_define.h).

Description :

Diverses façons de tester la valeur de retour d'une fonction.

Code :

E_RTN eRtn;


//- Utiliser la manière conventionnelle avec récupération du numéro d'erreur
if ( erOk == ( eRtn = Fonction(...) ) )
  //... Fonction Ok ...
else
  //... Fonction Pb ...


//- Utiliser la manière conventionnelle sans récupération du numéro d'erreur
if ( erOk == Fonction(...) )
  //... Fonction Ok ...
else
  //... Fonction Pb ...


//- Utiliser la macro eOk avec récupération du numéro d'erreur
if ( eOk( eRtn = Fonction(...) ) )
  //... Fonction Ok ...
else
  //... Fonction Pb ...


//- Utiliser la macro eOk sans récupération du numéro d'erreur
if ( eOk( Fonction(...) ) )
  //... Fonction Ok ...
else
  //... Fonction Pb ...


//- Utiliser la macro eOk avec récupération du numéro d'erreur
if ( !eOk( eRtn = Fonction(...) ) )
  //... Fonction Pb ...
else
  //... Fonction Ok ...


//- Utiliser la macro eOk sans récupération du numéro d'erreur
if ( !eOk( Fonction(...) ) )
  //... Fonction Pb ...
else
  //... Fonction Ok ...

erPtrNull = 100

La fonction a détectée un pointeur NULL qui ne peut être utilisé sous peine de plantage.

Cette erreur est souvent renvoyé lorsque l'on passe un pointeur NULL en argument d'une fonction.

erNew (= 101)

Le mot clé new n'a pas fonctionné, l'élément à allouer ne l'a pas été.

erMemAlloc = 200

L'objet EMemory n'a pas réussi à allouer ou reallouer la taille de mémoire demandée.

erMemAreaOut (= 201)

Une fonction demande à accéder à une donnée mémoire qui ne peut l'être, que ce soit en lecture ou en écriture, car elle est situé en dehors des zones accessibles au programme.

erMemAreaRide (= 202)

Une fonction demande à accéder à un intervalle de mémoire qui ne peut l'être, que ce soit en lecture ou en écriture, car une partie est située en dehors des zones accessibles au programme.

 

Gestion intelligente des valeurs de retour

La gestion des erreurs est chose difficile. Les fonctions des objets de la librairie Eclat sont programmées d'une manière particulière qui pourra dérouter certains.

Généralement lorsque l'on écrit une fonction, la première chose à faire est de tester si les éléments à utiliser sont valides ou pas pour ne pas faire planter le programme.

Description :

Test standard de valeurs passées en argument.

Code :

long MyCopyFunction( char *pcBufferDest, char *pcBufferSource, long lBufferSourceSize )
  {
  if ( !pcBufferDest || !pcBufferSource )
    return Error;

  if ( lBufferSourceSize )
    memcpy( pcBufferDest, pcBufferSource, lBufferSourceSize );

  return Ok;
  }

Les fonctions des objets de la librairie Eclat fonctionnent légèrement différemment. La réflection est la suivante : il ne faut déclencher une erreur que lorsque qu'il y a risque et non pas possibilité d'erreur.

Dans l'exemple précédent, si la valeur lBufferSourceSize est égale à 0 et que les pointeurs sont NULL, la fonction retournera une erreur alors qu'il n'y en aura jamais car la fonction memcpy (qui pourrait faire planter le programme) ne sera jamais appelée. Donc on peut écrire le code suivant :

Description :

Test de valeurs passées en argument.

Code :

long MyCopyFunction( char *pcBufferDest, char *pcBufferSource, long lBufferSourceSize )
  {
  if ( !lBufferSourceSize )
    return Ok;

  if ( !pcBufferDest || !pcBufferSource )
    return Error;

  memcpy( pcBufferDest, pcBufferSource, lBufferSourceSize );

  return Ok;
  }

Si vous passez des valeurs NULL pour les pointeurs pcBufferDest et pcBufferSource et que la variable lBufferSourceSize est égale à 0, la fonction indique que tout c'est bien passé car en fait vous demandez de copier 0 octet. Donc que les pointeurs soient NULL n'a aucune importance car ils ne seront jamais utilisés.

Par contre si vous passez des valeurs NULL pour les pointeurs pcBufferDest et pcBufferSource, et que lBufferSourceSize est différent de 0, alors une erreur sera déclenchée.

Les fonctions de la librairie Eclat ne déclenchent une erreur que si la situation est réellement dangeureuse afin de pouvoir laisser le programme suivre son cours plutôt que de l'arrêter alors qu'il n'y a pas de danger.

 

Minimum
Version 1.0.0