cerhu > comp.lang.* > comp.lang.ada

Frédéric Praca (11/06/2018, 21h05)
Salut à tous,
je me posais une petite question toute bête.
J'ai un fichier qui contient des valeurs entières représentant
normalement des températures comprises entre -273 et 5526.
Le problème est que ce fichier peut parfois contenir des valeurs hors
plage.

Quel est le "meilleur" moyen pour traiter ça ? Un test d'appartenance ou
la gestion des exceptions ?

Voilà deux exemples :
Un avec exception

with Ada.Text_Io; use Ada.Text_Io;

procedure Temperature_Test is
type Temperature is range -273..5526;

package Temperature_IO is new Integer_Io(Temperature);
use Temperature_IO;

begin
loop
declare
Read_Temperature : Temperature;
begin
Get(Read_Temperature);
Put_line("Read temperature : " &
Temperature'Image(Read_Temperature));
exception
when Data_Error =>
Put_Line("Pan");
when End_Error =>
exit;
end;
end loop;
end Temperature_Test;

L'autre par appartenance

with Ada.Text_Io; use Ada.Text_Io;

procedure Temperature_Test2 is

subtype Temperature is Integer range -273..5526;

package Integer_Text_IO is new Integer_Io(Integer);
use Integer_Text_IO;

begin
loop
declare
Read_Temperature : Temperature;
Read_Int : Integer;
begin
Get(Read_Int);
if Read_Int in Temperature'Range then
Read_Temperature := Temperature(Read_Int);
Put_line("Read temperature : " &
Temperature'Image(Read_Temperature));
end if;
exception
when End_Error =>
exit;
end;
end loop;
end Temperature_Test2;

Dans un cas, j'utilise un type et dans l'autre un sous-type et j'avoue
que je ne sais pas toujours quand utiliser l'un ou l'autre :)

Mais le test d'appartenance ne peut, bien entendu, fonctionner qu'avec le
sous-type.

Alors ? C'est quoi le mieux ?

Fred
Pascal Obry (11/06/2018, 21h37)
Salut Frédéric,

> Quel est le "meilleur" moyen pour traiter ça ? Un test d'appartenance ou
> la gestion des exceptions ?


Pour moi un test d'appartenance. Utiliser les exceptions pour contrôler
l'execution d'un programme me semble une erreur. Une exception doit
rester un moyen de traiter les cas exceptionnels et donc non prévus par
avance.

Comme référence (il y en a beaucoup d'autres):

[..]

Bonne soirée,
Lionel Draghi (11/06/2018, 22h23)
Le 11/06/2018 à 21:05, Frédéric Praca a écrit :
....
> Alors ? C'est quoi le mieux ?


Pour moi c'est une question de "normalité" du cas :

- si le format du fichier est spécifié, et qu'une valeur anormale
résulte d'un bug dans ce qui a généré le fichier ou d'un tripatouillage
du fichier, alors ce n'est pas le control flow normal, et une exception
me parait légitime.
Il y a des chances pour que le code du "flow" normal soit plus simple et
lisible, et le traitement du cas exceptionnel sera séparé.

- si le format du fichier peut "normalement" contenir des valeurs
invalides de "Temperature", alors je pense que le code doit le refléter
: le "Get (Integer)" et le "if valid" doivent être explicites.

Pour moi, le type avec lequel est instancié Integer_IO dit clairement ce
que je m'attends à récupérer dans le fichier dans le cas normal :
Integer ou Temperature.

Lionel
Frédéric Praca (11/06/2018, 23h36)
Le Mon, 11 Jun 2018 22:23:29 +0200, Lionel Draghi a écrit :

[..]
> - si le format du fichier peut "normalement" contenir des valeurs
> invalides de "Temperature", alors je pense que le code doit le refléter
> : le "Get (Integer)" et le "if valid" doivent être explicites.
> Pour moi, le type avec lequel est instancié Integer_IO dit clairement ce
> que je m'attends à récupérer dans le fichier dans le cas normal :
> Integer ou Temperature.
> Lionel


Merci Lionel, j'aime bien cette explication qui confirme ce que je pense
des exceptions, elles doivent être exceptionnelles :)

En fait, tout cela vient d'un petit puzzle sur coding game que je vous
laisse découvrir ([..] )

Fred
Frédéric Praca (11/06/2018, 23h45)
Le Mon, 11 Jun 2018 21:36:38 +0000, Frédéric Praca a écrit :

> Le Mon, 11 Jun 2018 22:23:29 +0200, Lionel Draghi a écrit :
>> Merci Lionel, j'aime bien cette explication qui confirme ce que je pense

> des exceptions, elles doivent être exceptionnelles :)
> En fait, tout cela vient d'un petit puzzle sur coding game que je vous
> laisse découvrir ([..] )
> Fred


J'ai oublié de préciser que j'avais largement sur-spécifié puisque les
données erronées ne font pas partie du jeu de tests mais comme Ada permet
un contrôle des types bien plus poussé que pas mal d'autres langages, je
me suis emporté :D
Discussions similaires
Bonne pratique

RFC ou bonne pratique

Bonne pratique de RRDtool

bonne pratique


Fuseau horaire GMT +2. Il est actuellement 10h52. | Privacy Policy