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 :
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
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;
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??
Partager