26. august 2008 - 20:55 Der er 7 kommentarer og
1 løsning

Try except inden i en anden try except

Jeg er ved at lave et lille program til tidsregistrering ved et cykelløb.
For at undgå forskellige fejlmeddelelser har jeg puttet nogle beregninger ind i en try except struktur, f.eks. beregningen af tiden, da slut tiden ikke er der når cykel rytteren oprettes, men først kommer når rytteren kommer i mål.
Så når sluttiden er et blankt felt bliver tiden ikke beregnet, og programmet fortsætter.
Men hvis BeregnTid laver en exception når den kaldes fra LoebNrExit så fanger dennes except fejlen, og focus sættes tilbage til LoebNr.

Kan man ikke cascade try except, eller er der en måde at annullere exceptionen når BeregnTid har reageret på den?

procedure TForm1.LoebNrExit(Sender: TObject);
begin
  if LoebNr.Text <> '' then
  begin
    try
      LobsNr := StrToInt(LoebNr.Text);
      PersonData := HentPersonData(LobsNr);
      if PersonData.Navn <> '' then
      begin
        Navn.Text    := PersonData.Navn;
        Rute.Text    := PersonData.Rute;
        StTid.Text    := TimeToStr(PersonData.Start);
        SlTid.Text    := TimeToStr(PersonData.Slut);
        Distance.Text := IntToStr(PersonData.Km);
        BeregnTid;
      end;
    except
      on EConvertError do LoebNr.SetFocus;
    end;
  end;
end;

procedure TForm1.BeregnTid;
begin
  try
    Tid.Text := TimeToStr(StrToTime(SlTid.Text) - StrToTime(StTid.Text));
    Udskriv.Enabled := True;
  except
    on EConvertError do Udskriv.Enabled := False;
  end;
end;
Avatar billede borrisholt Novice
26. august 2008 - 21:06 #1
Hmmn .. Til at starte på kan du helt fjerne exceptioen :

Du skriver :

procedure TForm1.BeregnTid;
begin
  try
    Tid.Text := TimeToStr(StrToTime(SlTid.Text) - StrToTime(StTid.Text));
    Udskriv.Enabled := True;
  except
    on EConvertError do Udskriv.Enabled := False;
  end;
end;

Hvis du vil undgå exceptionen kan du skrive :

procedure TForm1.BeregnTid;
var
  StartTid, SlutTid : TDateTime;
begin
  Tid.Text := '';
  if TryStrToTime(SlTid.Text, SlutTid) then
    if TryStrToTime(StTid.Text,StartTid ) then
      Tid.Text := TimeToStr(SlutTid - StartTid);

  Udskriv.Enabled := Tid.Text <> '';
end;

(Frit fra leveren)

Med andre ord så brug TryStrToTime i stedet for så kommer der slet ingen exception.


Jens Borrisholt
26. august 2008 - 21:37 #2
Tak for hjælpen.
Jeg kendte ikke TryStrToTime(
Læg et svar, så vi kan lukke spørgsmålet.
Avatar billede hrc Mester
26. august 2008 - 21:39 #3
Svaret på spørgsmålet er "raise":

try
  try
  except
    // Gør et eller andet for at rette op på fejlen
    raise; // send fejlen videre ud i systemet
  end;
except
  on e: exception do
    Message(e.Message,...);
end;

I øvrigt findes der en funktion tilsvarende TryStrToTime, til konvertering af heltal: StrToIntDef.
Avatar billede borrisholt Novice
26. august 2008 - 22:08 #4
hrc har ret, teknisk set svarer jeg selt ikke på dit spørgsmål, men hjælper dig dog af med problemet ...

Om jeg skal have points eller ej bestemmer du

Der findes en masse TryStrToXXXXX slå dem op i hjælpen sammen med StrToXXXDef

Jens Borrisholt
Avatar billede hrc Mester
27. august 2008 - 07:50 #5
jens: Det var ikke fordi jeg ville snuppe pointsene; kan godt se du løste problemet, men til information, ligesom med StrToIntDef, ville jeg lige nævne "raise".

Jeg kendte heller ikke tryStrToxxxxx, men har altid lavet dem selv. Navnet antyder ligesom hvordan de er lavet, ikke?
Avatar billede borrisholt Novice
27. august 2008 - 08:13 #6
hrc>> tryStrToxxxxx er IKKE bygger op med en try except end block. Exceptions er langsomme og bør derfor undgås ... tryStrToxxxxx performer der for ca 50 gange bedre end StrToxxxxx.

Men kig efter hvilke der findes. De har væretr mig til STOR hjælp siden Delphi 6 da de kom :D

Jens Borrisholt
Avatar billede arne_v Ekspert
01. september 2008 - 00:15 #7
Exceptions er langsomme hvis de faktisk kastes.

Fordelen ved TryStrToXxxx i forhold til StrToXxxx må derfor afhænge af hvor stor
en andel af input der er fejl i.
01. september 2008 - 23:36 #8
Undskyld Jens, jeg havde helt overset at du havde svaret.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester