26. august 2008 - 20:55Der 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;
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.
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.
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?
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
Undskyld Jens, jeg havde helt overset at du havde svaret.
Synes godt om
Ny brugerNybegynder
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.