27. april 2004 - 18:36Der er
26 kommentarer og 1 løsning
Try, except og finally for dummies
Ved klik på RadioButton3 skal der tjekes for om variablerne indholder værdier og gør der det, skal programmer forsætte ellers fejlmeddelse.
Som det er nu fås fejmeddelsen når der trykkes på RadioButton3, hvis variablerne ikke har fået tildelt nogen værdi: Se her: www.sunwind.dk/einvalidop.jpg
Forsøger med Try, except og finally men uden held.
Se mine koder her:
procedure TfmProfilValg.RadioButton3Click(Sender: TObject); var n: Integer; begin Try if (Form1.OpenDialog1.FileName = '') or (Radius <=0) or (P <=0) then except on EInvalidOp do begin Showmessage('Der er ikke fortaget nogen input af talværdier'); end; end;
Hvis jeg ellers har forstået dit spørgsmål rigtigt, så prøv med nedenstående:
procedure TfmProfilValg.RadioButton3Click(Sender: TObject); var n: Integer; begin if (Form1.OpenDialog1.FileName = '') or (Radius <=0) or (P <=0) then Showmessage('Der er ikke fortaget nogen input af talværdier'); else begin Memo1.Clear; frmProfil.seZoom.Value:=0; frmProfil.seVinkel.Value:=0; Memo1.Font.Name:='courier new'; Memo1.Font.Size:=9;
for n:=1 to 18 do begin //Indhold af for løkke end; end; end;
Try / except bruges til at "fange" de fejl der evt. måtte komme når du gør noget i dit program så du f.eks. kan vise en "pænere" fejlmeddelelse end den du linker til. Hvis du endelig skal bruge Try / excpet i dit eksempel, så prøv med nedenstående (går ud fra at din beregning bliver lavet i for løkken!):
Try for n:=1 to 18 do begin //Indhold af for løkke end; Except ShowMessage('Der skete en fejl under udregningen!'); End;
Det er det her sted, jeg mener! Når jeg klikker på RadioButton3 og der ikke er indskrevetnoget i OpenDialog1.FileName eller Radius eller P
begin Try if (Form1.OpenDialog1.FileName = '') or (Radius <=0) or (P <=0) then except on EInvalidOp do begin Showmessage('Der er ikke fortaget nogen input af talværdier'); end; end;
Vil du ændre nedstående kode, gerne indskrive forklaringer! Eller har du en bedere måde?
procedure TfmProfilValg.RadioButton3Click(Sender: TObject); var n: Integer; begin Try if (Form1.OpenDialog1.FileName = '') or (Radius <=0) or (P <=0)then except on EInvalidOp do begin Showmessage('Der er ikke fortaget nogen input af talværdier'); end; end;
procedure TfmProfilValg.RadioButton3Click(Sender: TObject); var n: Integer; begin if (Form1.OpenDialog1.FileName = '') or (Radius <=0) or (P <=0) then Showmessage('Der er ikke fortaget nogen input af talværdier'); else
Når der nu klikkes og der ingen værdier tilføjet, fås Showmessage. Men så kommer www.sunwind.dk/einvalidop.jpg denne fejmeddelse igen?
www.sunwind.dk/einvalidop.jpg fejlen vil ikke komme fordi du med "if (Form1.OpenDialog1.FileName = '') or (Radius <=0) or (P <=0) then" tjekker om betingelserne er til stede for at udføre en korrekt udregning.
Nu ved jeg så ikke hvad du laver i din for løkke, men hvis du sætter en try / except ind som vist i min første kommentar, så vil en evt. fejl blive fanget og "Showmessage('Der er ikke fortaget nogen input af talværdier');" vil blive udført.
procedure TfmProfilValg.RadioButton3Click(Sender: TObject); var n: Integer; begin if (Form1.OpenDialog1.FileName = '') or (Radius <=0) or (P <=0) then begin Showmessage('Der er ikke fortaget nogen input af talværdier'); Form1.Profilvalg1Click(Sender); end else begin Memo1.Clear; frmProfil.seZoom.Value:=0; frmProfil.seVinkel.Value:=0; Memo1.Font.Name:='courier new'; Memo1.Font.Size:=9;
for n:=1 to 18 do begin //Indhold af for løkke end; end; end;
Her koden: procedure TfmProfilValg.RadioButton3Click(Sender: TObject); var n: Integer; begin if (Form1.OpenDialog1.FileName = '') or (Radius <=0) or (P <=0) then begin Showmessage('Der er ikke fortaget nogen input af talværdier'); Form1.Profilvalg1Click(Sender); end else
Hallo. Ved at sætte en ekstre "end;" i slutningen af proceduren virkede det. Du skal havde mange tak, for din hjælp og ikke mindst din tolmodighed med mig.
Prøv med nedenstående. Tjek evt. selv lige om jeg har fået afsluttet for lækkerne de rigtige steder.
Du manglede bla. en begin helt i starten sådan så den kun lavede alle beregningerne hvis de rigtige betingelser var opfyldt.
procedure TfmProfilValg.RadioButton3Click(Sender: TObject); var n: Integer; begin if (Form1.OpenDialog1.FileName = '') or (Radius <=0) or (P <=0) then begin Showmessage('Der er ikke fortaget nogen input af talværdier'); Form1.Profilvalg1Click(Sender); end else begin Memo1.Clear; frmProfil.seZoom.Value:=0; frmProfil.seVinkel.Value:=0; Memo1.Font.Name:='courier new'; Memo1.Font.Size:=9;
for n:=1 to 18 do Naca4415X[n]:= 0.00; Naca4415OP[n] := 0.00; Naca4415NED[n] := 0.00;
for n:=1 to 18 do begin //SektionBredde[n]:= (16*pi*power(5000,2))/(9*i*1.0*2500*(power(5,2))); SektionBredde[n]:= (5.6*radius)/(i*1.0*Rkonstant*(power(5,2)));
Ja, men når du manglede en begin helt i toppen så bevirkede det at dine beregninger ville blive udført under alle omstændigheder - altså også selvom dine variabler indeholdte 0.
Try-except bruges til at håndtere fejlsituationer:
Table1.BeginTransaction; try // En database operation som risikerer at gå galt Table1.CommitTransaction; except Table1.RollbackTransaction; Raise; end;
Hvis der sker en fejl i databaseoperationen så "raises" en exception og programmet går til except-delen og ruller det hele tilbage igen. Derefter (vha. "raise") sender den exceptionen videre.
Du kan også selv definere dine exceptions eller naturligvis bruge de eksisterende (såsom "exception"):
try st := InputBox('Indtast','Skriv "Hej"',''); if st <> 'Hej' then raise Exception.Create('Du skrev ikke "Hej"!'); except on e: Exception do MessageDlg('Fejl opstået!+#13#10+e.Message,mtError,[mbOK],0); end;
Her starte man selv en exception fordi brugeren ikke skriver hvad der forlanges.
Endelig kan man kombinere det:
Screen.Cursor := crHourGlass; try Table1.BeginTransAction; try // En tung databaseoperation der risikerer at gå galt. Table1.CommitTransAction; except Table1.RollbackTransAction; end; finally Screen.Cursor := crDefault; end;
... Sådan gør man det.
Jeg fik det indtryk at du ville have koden til at starte en exception hvis det indtastede ikke var korrekt, såsom dette:
procedure TfmProfilValg.RadioButton3Click(Sender: TObject); var n: Integer; begin try if (Form1.OpenDialog1.FileName = '') or (Radius <=0) or (P <=0) then raise EInvalidOP.Create('Der er ikke fortaget input af talværdier');
// Resten af koden hvis der ER indtastet tal except on e: EInvalidOp do // Bemærk e: (grim syntaks), men skal bruges nedenfor "e.message" Showmessage(e.Message); end;
Til hrc Du har ret det var den sidste procedure du beskriver jeg ønskede. Men hvor er det svært, at beskrive problemmer og hvad man eksakt ønsker af funktioner eller løsning skal værer.
Flot beskrevet, og nu nogen funktioner jeg vil arbejde vider med. Tak
Ps: Det her og så godt du har beskrevet det, burde du havde Point for! Håber du kan vente til end anden gang?
Du skal kun tage dette indlæg som indlæring. Har fået det til, at virke men uden Try-Finally, Try-Except. Men får fejl ved nedstående procedure:
procedure TfmProfilValg.RadioButton3Click(Sender: TObject); var n: Integer; begin //if (Form1.OpenDialog1.FileName = '') then Exit; //if not (Form1.OpenDialog1.Execute) then begin; try if not(Radius >1) or (P >1) then raise EInvalidOP.Create('Der er ikke fortaget input af talværdier');
// Resten af koden hvis der ER indtastet tal except on e: EInvalidOp do // Bemærk e: (grim syntaks), men skal bruges nedenfor "e.message" Showmessage(e.Message); end;
Denne her funktion virker, men uden Try-Finally, Try-Except.
procedure TfmProfilValg.RadioButton3Click(Sender: TObject); var n: Integer; begin //if (Form1.OpenDialog1.FileName = '') then Exit; //if not (Form1.OpenDialog1.Execute) then begin;
if not (radius >1) or not (p >1) then begin Showmessage('Der er ikke indtastet nogen talværdier for NACA 4412'); Form1.Profilvalg1Click(Sender); end else begin
Det er helt i orden det med pointsene. Er stor fortaler af try-except/finally og havde lige lyst til at lave et belærede "skrift" om det.
Exceptions skal i øvrigt bruges med omtanke for de er relativt tunge og det er dødirriterende at debugge kode hvor der er exceptions - prøv du bare at se med ovenstående. Der dukker en exception op. Den trykker man OK til. Dernæst trykker man f9 og fortsætter, hvorefter man standses af endnu en meddelelse. Det er tungt og irriternde og man kan slå det fra i Delphi: Tools, Debugger Options, Language Exceptions, Stop on Delphi Exceptions, men så mister man også de "rigtige" exceptions.
Hvis man har en tidskritisk løkke med mange iterationer så er det smartere at undgå dem.
Se indlægget/tråden: Via IndputBox, at tildele variablen en værdi under Kommentar 29/04-2004 17:57:11 Ang. TSpinEdit, der har jeg en kommentar. Der kan jeg så give dig nogle Point.
Et andet vigtig indlæg: Konverter til 3D formatet dxf, dwg eller ipt Filer. Jeg ar bejder meget med autocad 2004 og inventor 6 Og det vingeprofil-program jeg har lavet,hvis resultst, vil jeg gerne havde konvertert til dwg file. Ønsker, at kunne tegne en vinge færdig med alle sektioner af profiler og med en overflade, så det ligner en rigtig møllevinge. Mvh monie
Jeg får 2 fejl ved kørslel af koderne her? try if not (Radius >1) or (P >1) then Får fejl her -->raise EInvalidOP.Create('Der er ikke fortaget input af talværdier');
// Resten af koden hvis der ER indtastet tal except on e: EZeroDivide do begin Får fejl her --> Showmessage('Fejl:'+e.Message'); // Bemærk e: (grim syntaks), men skal bruges nedenfor "e.message" Showmessage(e.Message); end; end;
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.