IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

try except qui affiche quand même l'erreur


Sujet :

Delphi

  1. #1
    Membre actif Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Points : 279
    Points
    279
    Par défaut try except qui affiche quand même l'erreur
    bonjour à tous,

    Je voudrais pouvoir gérer des erreurs comme des divisions par zéro à l'aide du bloc try except, sauf que celui-ci n'affiche pas mon erreur et laisse Delphi en afficher une(Division par zéro en virgule flottante). Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    function TArbre.Evalue(Noeud : TNoeud) : extended;
    begin
      result:=0;
      if Error <> '' then Exit;
      try
        if Noeud.Operateur = 'c' then result:=Noeud.Value else
        if Noeud.Operateur = '(' then result:=Evalue(Noeud.Fils[0])                          else
        if Noeud.Operateur = '+' then result:=Evalue(Noeud.Fils[0]) + Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = '-' then result:=Evalue(Noeud.Fils[0]) - Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = '×' then result:=Evalue(Noeud.Fils[0]) * Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = 'random' then result:=random(round(Evalue(Noeud.Fils[0])))       else
        if Noeud.Operateur = 'int' then result:=int(Evalue(Noeud.Fils[0]))                    else
        if Noeud.operateur = 'variable' then result:=Evalue(Noeud.Fils[0])                   else
        if Noeud.Operateur = 'arrondi' then result:=roundTo( Evalue(Noeud.Fils[0]) , round( Evalue(Noeud.Fils[1])) ) else
        if Noeud.Operateur = 'longueur' then result:=length(Noeud.Fils[0].Operateur) else
        if Noeud.Operateur = '÷' then result:=Evalue(Noeud.Fils[0]) / Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = '%' then result:=Evalue(Noeud.Fils[0]) / 100                    else
        if Noeud.Operateur = '^' then result:=Power(Evalue(Noeud.Fils[0]),Evalue(Noeud.Fils[1])) else
        if Noeud.Operateur = 'sqrt' then result:=Sqrt(Evalue(Noeud.Fils[0]))                       else
        if Noeud.Operateur = 'log' then result:=Log10(Evalue(Noeud.Fils[0]))                       else
        if Noeud.Operateur = 'ln' then result:=ln(Evalue(Noeud.Fils[0]))                           else
        if Mode = degre then
        begin
          if Noeud.Operateur = 'arccos' then result:=Arccos(Evalue(Noeud.Fils[0]))*180/pi            else
          if Noeud.Operateur = 'arcsin' then result:=Arcsin(Evalue(Noeud.Fils[0]))*180/pi            else
          if Noeud.Operateur = 'arctan' then result:=Arctan(Evalue(Noeud.Fils[0]))*180/pi            else
          if Noeud.Operateur = 'cos' then result:=Cos(Evalue(Noeud.Fils[0])*pi/180)                  else
          if Noeud.Operateur = 'sin' then result:=Sin(Evalue(Noeud.Fils[0])*pi/180)                  else
          if Noeud.Operateur = 'tan' then result:=Tan(Evalue(Noeud.Fils[0])*pi/180);
        end else
        begin
          if Noeud.Operateur = 'arccos' then result:=Arccos(Evalue(Noeud.Fils[0]))            else
          if Noeud.Operateur = 'arcsin' then result:=Arcsin(Evalue(Noeud.Fils[0]))            else
          if Noeud.Operateur = 'arctan' then result:=Arctan(Evalue(Noeud.Fils[0]))            else
          if Noeud.Operateur = 'cos' then result:=Cos(Evalue(Noeud.Fils[0]))                  else
          if Noeud.Operateur = 'sin' then result:=Sin(Evalue(Noeud.Fils[0]))                  else
          if Noeud.Operateur = 'tan' then result:=Tan(Evalue(Noeud.Fils[0]));
        end;
      except
        on EDivByzero do
        begin
          Error:='Erreur : division par 0';
          ShowMessage(Error);
        end;
        //on EInvalidPointer do Error:='Erreur : pas assez de paramètres originaux';
      end;
     
    end;
    J'ai lu sur internet que le message de delphi s'affichait seulement quand on est dans l'ide, mais là, il s'affiche même via l'exe
    Je suis novice avec ce type de bloc, ça doit être tout simple mais je n'arrive pas à trouver...

    Je voudrais aussi gérer l'exeption au cas où un des fils appelés n'existe pas, j'ai pensé à EInvalidPointer mais apparemment ce n'est pas elle...
    Qqn aurait une idée??

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    Par défaut
    L'exception est EZeroDivide, c'est pour cela qu'elle s'affiche.
    Pour savoir quel est le type de l'exception qui n'est pas géré, tu peux utiliser quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      on E:EZeroDivide do begin
     
     
      end;
      on E:Exception do begin
      showmessage(E.ClassName);
      end;

  3. #3
    Membre actif Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Points : 279
    Points
    279
    Par défaut
    merci pour la rapidité de ta réponse,

    L'exception est EZeroDivide, c'est pour cela qu'elle s'affiche.
    Je voudrais justement qu'elle ne s'affiche pas et que ce soit mon erreur qui apparaisse. Avec ton code, l'erreur de Delphi et la mienne s'affichent.
    Quant à l'autre exeption, c'est EAccessViolation qu'il fallait mettre, merci bcp!

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 435
    Points : 5 848
    Points
    5 848
    Par défaut
    salut


    bin enleve la gestion d'erreur dans ces cas là

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    function TArbre.Evalue(Noeud : TNoeud) : extended;
    begin
      result:=0;
      if Error <> '' then Exit;
      try
        if Noeud.Operateur = 'c' then result:=Noeud.Value else
        if Noeud.Operateur = '(' then result:=Evalue(Noeud.Fils[0])                          else
        if Noeud.Operateur = '+' then result:=Evalue(Noeud.Fils[0]) + Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = '-' then result:=Evalue(Noeud.Fils[0]) - Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = '×' then result:=Evalue(Noeud.Fils[0]) * Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = 'random' then result:=random(round(Evalue(Noeud.Fils[0])))       else
        if Noeud.Operateur = 'int' then result:=int(Evalue(Noeud.Fils[0]))                    else
        if Noeud.operateur = 'variable' then result:=Evalue(Noeud.Fils[0])                   else
        if Noeud.Operateur = 'arrondi' then result:=roundTo( Evalue(Noeud.Fils[0]) , round( Evalue(Noeud.Fils[1])) ) else
        if Noeud.Operateur = 'longueur' then result:=length(Noeud.Fils[0].Operateur) else
        if Noeud.Operateur = '÷' then result:=Evalue(Noeud.Fils[0]) / Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = '%' then result:=Evalue(Noeud.Fils[0]) / 100                    else
        if Noeud.Operateur = '^' then result:=Power(Evalue(Noeud.Fils[0]),Evalue(Noeud.Fils[1])) else
        if Noeud.Operateur = 'sqrt' then result:=Sqrt(Evalue(Noeud.Fils[0]))                       else
        if Noeud.Operateur = 'log' then result:=Log10(Evalue(Noeud.Fils[0]))                       else
        if Noeud.Operateur = 'ln' then result:=ln(Evalue(Noeud.Fils[0]))                           else
        if Mode = degre then
        begin
          if Noeud.Operateur = 'arccos' then result:=Arccos(Evalue(Noeud.Fils[0]))*180/pi            else
          if Noeud.Operateur = 'arcsin' then result:=Arcsin(Evalue(Noeud.Fils[0]))*180/pi            else
          if Noeud.Operateur = 'arctan' then result:=Arctan(Evalue(Noeud.Fils[0]))*180/pi            else
          if Noeud.Operateur = 'cos' then result:=Cos(Evalue(Noeud.Fils[0])*pi/180)                  else
          if Noeud.Operateur = 'sin' then result:=Sin(Evalue(Noeud.Fils[0])*pi/180)                  else
          if Noeud.Operateur = 'tan' then result:=Tan(Evalue(Noeud.Fils[0])*pi/180);
        end else
        begin
          if Noeud.Operateur = 'arccos' then result:=Arccos(Evalue(Noeud.Fils[0]))            else
          if Noeud.Operateur = 'arcsin' then result:=Arcsin(Evalue(Noeud.Fils[0]))            else
          if Noeud.Operateur = 'arctan' then result:=Arctan(Evalue(Noeud.Fils[0]))            else
          if Noeud.Operateur = 'cos' then result:=Cos(Evalue(Noeud.Fils[0]))                  else
          if Noeud.Operateur = 'sin' then result:=Sin(Evalue(Noeud.Fils[0]))                  else
          if Noeud.Operateur = 'tan' then result:=Tan(Evalue(Noeud.Fils[0]));
        end;
      except
       (* on EDivByzero do
        begin
          Error:='Erreur : division par 0';
          ShowMessage(Error);
        end;
        //on EInvalidPointer do Error:='Erreur : pas assez de paramètres originaux'; *)
      end;
     
    end;

  5. #5
    Membre actif Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Points : 279
    Points
    279
    Par défaut
    Je crois que je me suis mal expliqué,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if Noeud.Operateur = '÷' then result:=Evalue(Noeud.Fils[0]) / Evalue(Noeud.Fils[1]) else
    avec mon code, il y a 2 messages d'erreur quand Evalue(Noeud.Fils[1]) = 0 :

    une de delphi : Division par zéro en virgule flottante
    puis une de moi qui affiche : Erreur : Division par zéro

    je voudrais éviter celle de delphi qui envoie une boite de dialogue un peu moche et surtout un texte qui ne me convient pas et mettre à la place mon message d'erreur avec un messageDlg et me retrouver avec une seule erreur affichée.

    Je pourrais tout simplement éviter l'erreur en vérifiant que Noeud.fils[1] soit différent de 0 avant, mais je voudrais gérer d'autres erreurs imprévisibles

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 435
    Points : 5 848
    Points
    5 848
    Par défaut
    salut

    effectivement c'est plus clair comme cela ^^
    sauf que je ne vois pas ou tu divise dans ta fonction évalue ... je suppose donc qu'elle se trouve ailleurs dans le programme
    donc deux choix s'impose a toi soit tu traite l’exception
    soit tu lève l’exception avec la méthode raise dans le corps de la méthode déclenchant

    Pour traiter l’exception // tu connais mais je le rappel a ceux qui lise le thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try
      ...
    Except
      on EDivByzero do 
      begin
        ...
      end;
    end;
    Pour levé une exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    try
      ...
    Except
      on EDivByzero do
      begin
        ... //traitement de l'exception
        raise; // l'exception est relever et donc passée à la procédure appelante
      end;
    end;

  7. #7
    Membre actif Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Points : 279
    Points
    279
    Par défaut
    merci,

    j'avais déjà essayer ce mot clé mais les résultats sont différents :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        if Noeud.Operateur = '÷' then result:=Evalue(Noeud.Fils[0]) / Evalue(Noeud.Fils[1]) else
    C'est ici que je fais une division avec une possibilité de division par 0.
    S'il y en a une, je n'ai que le message de Delphi et mon message ne s'affiche pas..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       if Noeud.Operateur = 'arrondi' then result:=roundTo( Evalue(Noeud.Fils[0]) , round( Evalue(Noeud.Fils[1])) ) else
    et là, si Noeud.Fils[1] n'existe pas, mon message d'erreur s'affiche bien mais celui de delphi apparait juste après même avec l'exe...

    voici le code que j'ai utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    function TArbre.Evalue(Noeud : TNoeud) : extended;
    begin
      result:=0;
      if Error <> '' then Exit;
      try
        if Noeud.Operateur = 'c' then result:=Noeud.Value else
        if Noeud.Operateur = '(' then result:=Evalue(Noeud.Fils[0])                          else
        if Noeud.Operateur = '+' then result:=Evalue(Noeud.Fils[0]) + Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = '-' then result:=Evalue(Noeud.Fils[0]) - Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = '×' then result:=Evalue(Noeud.Fils[0]) * Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = 'random' then result:=random(round(Evalue(Noeud.Fils[0])))       else
        if Noeud.Operateur = 'int' then result:=int(Evalue(Noeud.Fils[0]))                    else
        if Noeud.operateur = 'variable' then result:=Evalue(Noeud.Fils[0])                   else
        if Noeud.Operateur = 'arrondi' then result:=roundTo( Evalue(Noeud.Fils[0]) , round( Evalue(Noeud.Fils[1])) ) else
        if Noeud.Operateur = 'longueur' then result:=length(Noeud.Fils[0].Operateur) else
        if Noeud.Operateur = '÷' then result:=Evalue(Noeud.Fils[0]) / Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = '%' then result:=Evalue(Noeud.Fils[0]) / 100                    else
        if Noeud.Operateur = '^' then result:=Power(Evalue(Noeud.Fils[0]),Evalue(Noeud.Fils[1])) else
        if Noeud.Operateur = 'sqrt' then result:=Sqrt(Evalue(Noeud.Fils[0]))                       else
        if Noeud.Operateur = 'log' then result:=Log10(Evalue(Noeud.Fils[0]))                       else
        if Noeud.Operateur = 'ln' then result:=ln(Evalue(Noeud.Fils[0]))                           else
        if Mode = degre then
        begin
          if Noeud.Operateur = 'arccos' then result:=Arccos(Evalue(Noeud.Fils[0]))*180/pi            else
          if Noeud.Operateur = 'arcsin' then result:=Arcsin(Evalue(Noeud.Fils[0]))*180/pi            else
          if Noeud.Operateur = 'arctan' then result:=Arctan(Evalue(Noeud.Fils[0]))*180/pi            else
          if Noeud.Operateur = 'cos' then result:=Cos(Evalue(Noeud.Fils[0])*pi/180)                  else
          if Noeud.Operateur = 'sin' then result:=Sin(Evalue(Noeud.Fils[0])*pi/180)                  else
          if Noeud.Operateur = 'tan' then result:=Tan(Evalue(Noeud.Fils[0])*pi/180);
        end else
        begin
          if Noeud.Operateur = 'arccos' then result:=Arccos(Evalue(Noeud.Fils[0]))            else
          if Noeud.Operateur = 'arcsin' then result:=Arcsin(Evalue(Noeud.Fils[0]))            else
          if Noeud.Operateur = 'arctan' then result:=Arctan(Evalue(Noeud.Fils[0]))            else
          if Noeud.Operateur = 'cos' then result:=Cos(Evalue(Noeud.Fils[0]))                  else
          if Noeud.Operateur = 'sin' then result:=Sin(Evalue(Noeud.Fils[0]))                  else
          if Noeud.Operateur = 'tan' then result:=Tan(Evalue(Noeud.Fils[0]));
        end;
      except
        on EDivByzero do
        begin
          Error:='Erreur : division par 0';
          MessageDlg(error,mtWarning,[mbOK],0);
          raise;
        end;
     
        on EAccessViolation do
        begin
          Error:='Erreur : pas assez de paramètres originaux pour la fonction ' + Noeud.Operateur;
          MessageDlg(error,mtWarning,[mbOK],0);
          raise;
        end;
      end;
     
    end;
    Qu'est ce que je rate??

  8. #8
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    Par défaut
    Si tu capture EZeroDivide et non EDivByzero, il n'y a que ton message qui s'affiche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
       on EZeroDivide do
        begin  
        Error:='Erreur : division par 0';
          MessageDlg(error,mtWarning,[mbOK],0);
          raise;
        end;
     
        on EAccessViolation do
        begin
          Error:='Erreur : pas assez de paramètres originaux pour la fonction ' + Noeud.Operateur;
          MessageDlg(error,mtWarning,[mbOK],0);
          raise;
        end;  
    on E:Exception do
     begin   
     showmessage(E.ClassName);
      end;

  9. #9
    Membre actif Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Points : 279
    Points
    279
    Par défaut
    Faudra m'expliquer où est-ce que j'étais pondre ça
    merci le fonctionnement est beaucoup plus logique mais j'ai toujours ce de problème des 2 messages qui s'affichent malgré raise :
    mon message d'erreur puis celui de delphi que je veux supprimer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    function TArbre.Evalue(Noeud : TNoeud) : extended;
    begin
      result:=0;
      if Error <> '' then Exit;
      try
        if Noeud.Operateur = 'c' then result:=Noeud.Value else
        if Noeud.Operateur = '(' then result:=Evalue(Noeud.Fils[0])                          else
        if Noeud.Operateur = '+' then result:=Evalue(Noeud.Fils[0]) + Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = '-' then result:=Evalue(Noeud.Fils[0]) - Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = '×' then result:=Evalue(Noeud.Fils[0]) * Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = 'random' then result:=random(round(Evalue(Noeud.Fils[0])))       else
        if Noeud.Operateur = 'int' then result:=int(Evalue(Noeud.Fils[0]))                    else
        if Noeud.operateur = 'variable' then result:=Evalue(Noeud.Fils[0])                   else
        if Noeud.Operateur = 'arrondi' then result:=roundTo( Evalue(Noeud.Fils[0]) , round( Evalue(Noeud.Fils[1])) ) else
        if Noeud.Operateur = 'longueur' then result:=length(Noeud.Fils[0].Operateur) else
        if Noeud.Operateur = '÷' then result:=Evalue(Noeud.Fils[0]) / Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = '%' then result:=Evalue(Noeud.Fils[0]) / 100                    else
        if Noeud.Operateur = '^' then result:=Power(Evalue(Noeud.Fils[0]),Evalue(Noeud.Fils[1])) else
        if Noeud.Operateur = 'sqrt' then result:=Sqrt(Evalue(Noeud.Fils[0]))                       else
        if Noeud.Operateur = 'log' then result:=Log10(Evalue(Noeud.Fils[0]))                       else
        if Noeud.Operateur = 'ln' then result:=ln(Evalue(Noeud.Fils[0]))                           else
        if Mode = degre then
        begin
          if Noeud.Operateur = 'arccos' then result:=Arccos(Evalue(Noeud.Fils[0]))*180/pi            else
          if Noeud.Operateur = 'arcsin' then result:=Arcsin(Evalue(Noeud.Fils[0]))*180/pi            else
          if Noeud.Operateur = 'arctan' then result:=Arctan(Evalue(Noeud.Fils[0]))*180/pi            else
          if Noeud.Operateur = 'cos' then result:=Cos(Evalue(Noeud.Fils[0])*pi/180)                  else
          if Noeud.Operateur = 'sin' then result:=Sin(Evalue(Noeud.Fils[0])*pi/180)                  else
          if Noeud.Operateur = 'tan' then result:=Tan(Evalue(Noeud.Fils[0])*pi/180);
        end else
        begin
          if Noeud.Operateur = 'arccos' then result:=Arccos(Evalue(Noeud.Fils[0]))            else
          if Noeud.Operateur = 'arcsin' then result:=Arcsin(Evalue(Noeud.Fils[0]))            else
          if Noeud.Operateur = 'arctan' then result:=Arctan(Evalue(Noeud.Fils[0]))            else
          if Noeud.Operateur = 'cos' then result:=Cos(Evalue(Noeud.Fils[0]))                  else
          if Noeud.Operateur = 'sin' then result:=Sin(Evalue(Noeud.Fils[0]))                  else
          if Noeud.Operateur = 'tan' then result:=Tan(Evalue(Noeud.Fils[0]));
        end;
      except
        on EAccessViolation do
        begin
          Error:='Erreur : pas assez de paramètres originaux pour la fonction ' + Noeud.Operateur;
          MessageDlg(error,mtWarning,[mbOK],0);
          raise;
        end;
     
        on EZeroDivide do
        begin
          Error:='Erreur : division par 0';
          MessageDlg(error,mtWarning,[mbOK],0);
          raise;
        end;
     
        on E:Exception do
        begin
          Error:='Erreur';
          MessageDlg(error,mtWarning,[mbOK],0);
          raise;
        end;
      end;
     
    end;

  10. #10
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 487
    Points : 3 120
    Points
    3 120
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    except
      on EDivByzero do
          begin
            Error:='Erreur : division par 0';
            ShowMessage(Error);
          end;
      on E:Exception do
          begin
            Error:=E.Message;
            // Ne pas afficher l'erreur et  l'enregistrer quelque part
          end;
    end;

  11. #11
    Membre actif Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Points : 279
    Points
    279
    Par défaut
    Parfait!!

    merci beaucoup à vous 3 pour votre patience et pour la rapidité de votre réponse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    function TArbre.Evalue(Noeud : TNoeud) : extended;
    begin
      result:=0;
      if Error <> '' then Exit;
      try
        if Noeud.Operateur = 'c' then result:=Noeud.Value else
        if Noeud.Operateur = '(' then result:=Evalue(Noeud.Fils[0])                          else
        if Noeud.Operateur = '+' then result:=Evalue(Noeud.Fils[0]) + Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = '-' then result:=Evalue(Noeud.Fils[0]) - Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = '×' then result:=Evalue(Noeud.Fils[0]) * Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = 'random' then result:=random(round(Evalue(Noeud.Fils[0])))       else
        if Noeud.Operateur = 'int' then result:=int(Evalue(Noeud.Fils[0]))                    else
        if Noeud.operateur = 'variable' then result:=Evalue(Noeud.Fils[0])                   else
        if Noeud.Operateur = 'arrondi' then result:=roundTo( Evalue(Noeud.Fils[0]) , round( Evalue(Noeud.Fils[1])) ) else
        if Noeud.Operateur = 'longueur' then result:=length(Noeud.Fils[0].Operateur) else
        if Noeud.Operateur = '÷' then result:=Evalue(Noeud.Fils[0]) / Evalue(Noeud.Fils[1]) else
        if Noeud.Operateur = '%' then result:=Evalue(Noeud.Fils[0]) / 100                    else
        if Noeud.Operateur = '^' then result:=Power(Evalue(Noeud.Fils[0]),Evalue(Noeud.Fils[1])) else
        if Noeud.Operateur = 'sqrt' then result:=Sqrt(Evalue(Noeud.Fils[0]))                       else
        if Noeud.Operateur = 'log' then result:=Log10(Evalue(Noeud.Fils[0]))                       else
        if Noeud.Operateur = 'ln' then result:=ln(Evalue(Noeud.Fils[0]))                           else
        if Mode = degre then
        begin
          if Noeud.Operateur = 'arccos' then result:=Arccos(Evalue(Noeud.Fils[0]))*180/pi            else
          if Noeud.Operateur = 'arcsin' then result:=Arcsin(Evalue(Noeud.Fils[0]))*180/pi            else
          if Noeud.Operateur = 'arctan' then result:=Arctan(Evalue(Noeud.Fils[0]))*180/pi            else
          if Noeud.Operateur = 'cos' then result:=Cos(Evalue(Noeud.Fils[0])*pi/180)                  else
          if Noeud.Operateur = 'sin' then result:=Sin(Evalue(Noeud.Fils[0])*pi/180)                  else
          if Noeud.Operateur = 'tan' then result:=Tan(Evalue(Noeud.Fils[0])*pi/180);
        end else
        begin
          if Noeud.Operateur = 'arccos' then result:=Arccos(Evalue(Noeud.Fils[0]))            else
          if Noeud.Operateur = 'arcsin' then result:=Arcsin(Evalue(Noeud.Fils[0]))            else
          if Noeud.Operateur = 'arctan' then result:=Arctan(Evalue(Noeud.Fils[0]))            else
          if Noeud.Operateur = 'cos' then result:=Cos(Evalue(Noeud.Fils[0]))                  else
          if Noeud.Operateur = 'sin' then result:=Sin(Evalue(Noeud.Fils[0]))                  else
          if Noeud.Operateur = 'tan' then result:=Tan(Evalue(Noeud.Fils[0]));
        end;
      except
        on EZeroDivide do Error:='Erreur : division par 0';
        on EAccessViolation do Error:='Erreur : pas assez de paramètres originaux pour la fonction ' + Noeud.Operateur;
        on E:Exception do Error:='Erreur';
      end;

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Je trouve étrange que tu programmes une calculatrice mais que tu demandes au programme compilé de gérer les erreurs.

    Autrement dit tu fais un interpréteur, mais en te déchargeant de la partie des cas hors limites.

    Tu sais que division par zéro est interdite pourquoi tu ne testes pas avant?
    Tu sais que le ln d'un négatif est interdit tu le laisse le gestionnaire du système s'en charger.

  13. #13
    Membre actif Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Points : 279
    Points
    279
    Par défaut
    Justement cela rajoutetait beaucoup de code : tester pour chaque fonctions si tous les noeuds existent bien, gérer tous les cas hors limites, je préfere faire comme ça, je n'oublierais aucune contrainte, le code sera plus lisible, les fonctions seront plus faciles à rajouter...

  14. #14
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    sous delphi 2010:
    Outils > Options > Options du débogueur > Exceptions du langage

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/12/2006, 19h00
  2. Une cellule sans contenu mais affichée quand même?
    Par petozak dans le forum Balisage (X)HTML et validation W3C
    Réponses: 30
    Dernier message: 30/08/2006, 18h19
  3. [Système] condition if qui sexécute quand même
    Par sam01 dans le forum Langage
    Réponses: 8
    Dernier message: 22/08/2006, 14h43
  4. boucle simple dans une dataGrid avec quand même une erreur !
    Par fkr dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 07/11/2005, 15h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo