Discussion:
Bonne pratique
(trop ancien pour répondre)
Frédéric Praca
2018-06-11 19:05:10 UTC
Permalink
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
2018-06-11 19:37:04 UTC
Permalink
Salut Frédéric,
Post by Frédéric Praca
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):

http://wiki.c2.com/?DontUseExceptionsForFlowControl

Bonne soirée,
--
Pascal Obry / Magny Les Hameaux (78)

The best way to travel is by means of imagination

http://www.obry.net

gpg --keyserver keys.gnupg.net --recv-key F949BD3B
Lionel Draghi
2018-06-11 20:23:29 UTC
Permalink
Le 11/06/2018 à 21:05, Frédéric Praca a écrit :
...
Post by Frédéric Praca
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
2018-06-11 21:36:38 UTC
Permalink
Post by Lionel Draghi
...
Post by Frédéric Praca
Alors ? C'est quoi le mieux ?
- 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
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 (https://www.codingame.com/ide/puzzle/temperatures )

Fred
Frédéric Praca
2018-06-11 21:45:15 UTC
Permalink
Post by Frédéric Praca
Post by Lionel Draghi
...
Post by Frédéric Praca
Alors ? C'est quoi le mieux ?
- 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
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 (https://www.codingame.com/ide/puzzle/temperatures )
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

Continuer la lecture sur narkive:
Loading...