try except

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Adenos
Beiträge: 67
Registriert: So 17. Okt 2021, 17:18
OS, Lazarus, FPC: Windows 7
CPU-Target: X86
Wohnort: Allgäu

try except

Beitrag von Adenos »

in meinem Programm möchte ich alle paar Minuten die aktuellen Cryptokurse abrufen. Da bei uns der Internetempfang sehr schlecht ist und oft überhaupt kein Internetzugriff möglich ist, möchte ich den Zugriff mit einem try-except-Block abfangen. Falls der Internetempfang nicht möglich ist, soll das Programm besser die alten Werte behalten. Aber ich mache da wohl etwas falsch, aber ich finde den Fehler nicht.

Code: Alles auswählen

 
begin
  SL := TStringList.Create;
  try
    httpsend.HttpGetText('https://coinranking.com/', SL);
    SL.SaveToFile(Anwendungsdatenordner+'CryptoKurse.dat');
    StringGridCrypto.RowCount := 51;
    StringGridCrypto.ColWidths[0] := 19;
    StringGridCrypto.Width:=189;
    begin
      SL := TStringList.Create;
      SL.LoadFromFile(Anwendungsdatenordner+'Cryptokurse.dat');
      Seitentext := copy(SL.Text, 2, 165000);
      for i := 0 to 49 do
      begin
        StringGridCrypto.Cells[0,(i+1)] := IntToStr(i+1);
        Anfang := Pos('</a> <span class="profile__subtitle">',Seitentext);
        Seitentext := copy(Seitentext, Anfang+40);
        Temptext := Trim(Copy(Seitentext, 1, 14));
        StringGridCrypto.Cells[1,(i+1)] := Temptext;
        Anfang := Pos('$', Seitentext);
        Seitentext := copy(Seitentext, Anfang+20);
        Temptext:=Trim(Copy(Seitentext,1,15));
        Preis:= StringReplace(Temptext, ',', '', [rfReplaceAll]);//löscht alle Kommas
        Preis := StringReplace(Preis,'.', ',',[rfReplaceAll]);//tauscht Punkt in Komma
        StringGridCrypto.Cells[2,(i+1)] := Preis;
      end;
    StringGridCrypto.Cells[0,(0)] := '';
  except
    exit;
  end;
Zuletzt geändert von m.fuchs am Do 6. Jan 2022, 15:01, insgesamt 1-mal geändert.
Grund: Highlighter gesetzt

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: try except

Beitrag von Ally »

Hallo Adenos,

ohne mich jetzt genau damit beschäftigt zu haben was da genau passieren soll, denke ich, dass der Programmabschnitt nicht richtig strukturiert ist.(begin end)
Vieleicht soll es ja etwa so aussehen:

Code: Alles auswählen

begin
  SL := TStringList.Create;
  try
    httpsend.HttpGetText('https://coinranking.com/', SL);
    SL.SaveToFile(Anwendungsdatenordner + 'CryptoKurse.dat');
    StringGridCrypto.RowCount := 51;
    StringGridCrypto.ColWidths[0] := 19;
    StringGridCrypto.Width := 189;
    SL := TStringList.Create;
    SL.LoadFromFile(Anwendungsdatenordner + 'Cryptokurse.dat');
    Seitentext := copy(SL.Text, 2, 165000);
    for i := 0 to 49 do
    begin
      StringGridCrypto.Cells[0, (i + 1)] := IntToStr(i + 1);
      Anfang := Pos('</a> <span class="profile__subtitle">', Seitentext);
      Seitentext := copy(Seitentext, Anfang + 40);
      Temptext := Trim(Copy(Seitentext, 1, 14));
      StringGridCrypto.Cells[1, (i + 1)] := Temptext;
      Anfang := Pos('$', Seitentext);
      Seitentext := copy(Seitentext, Anfang + 20);
      Temptext := Trim(Copy(Seitentext, 1, 15));
      Preis := StringReplace(Temptext, ',', '', [rfReplaceAll]);//löscht alle Kommas
      Preis := StringReplace(Preis, '.', ',', [rfReplaceAll]);//tauscht Punkt in Komma
      StringGridCrypto.Cells[2, (i + 1)] := Preis;
    end;
    StringGridCrypto.Cells[0, (0)] := '';
  except
    exit;
  end;
end;

Adenos
Beiträge: 67
Registriert: So 17. Okt 2021, 17:18
OS, Lazarus, FPC: Windows 7
CPU-Target: X86
Wohnort: Allgäu

Re: try except

Beitrag von Adenos »

ja, danke, das war's .

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: try except

Beitrag von charlytango »

mir fällt nur auf dass mit

Code: Alles auswählen

SL := TStringList.Create;
das Objekt SL zweimal erstellt wird -- da müsste es doch heftig krachen.

Dafür wird das erstellt Objekt SL nirgends mehr zerstört, zb mit

Code: Alles auswählen

freeandnil(SL);
Empfehle:
https://forum.lazarus.freepascal.org/in ... ic=10333.0
viewtopic.php?f=55&t=13414&p=119643&hil ... ly#p119643

Code: Alles auswählen

begin
  SL := TStringList.Create; //Allocate
  try
    try
      // do Something -- also allen Code hier rein, aber ohne ein zweites mal SL zu erstellen;
    finally
      freeandnil(SL);//DeAllocate
    end;
  except
    //DoHandleException - hier kann man auch auf die unterschiedlichen Arten von Exceptions die zB
    //die Internetverbindung/httpsend auslöst reagieren
    //zB Timeouts anders behandeln bzw monitieren als andere Fehler
  end;
end;  

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: try except

Beitrag von fliegermichl »

charlytango hat geschrieben:
Fr 7. Jan 2022, 10:59
mir fällt nur auf dass mit

Code: Alles auswählen

SL := TStringList.Create;
das Objekt SL zweimal erstellt wird -- da müsste es doch heftig krachen.
Nein, krachen tut da nix. Es bleibt ein Speicherleck übrig.

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: try except

Beitrag von charlytango »

fliegermichl hat geschrieben:
Fr 7. Jan 2022, 11:09
Nein, krachen tut da nix. Es bleibt ein Speicherleck übrig.
Auch nicht wirklich eleganter - und frisst Speicher. besonders wenn das in dem erwähnten Timer läuft.
Zuletzt geändert von charlytango am Fr 7. Jan 2022, 11:24, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: try except

Beitrag von theo »

Der ganze Ansatz ist wahrscheinlich falsch, da HttpGetText ziemlich sicher keine Exception auslöst, sondern "true" zurück gibt, wenn alles geklappt hat, bzw. "false" wenn es nicht geklappt hat.

Statt "try...except" machst du besser

Code: Alles auswählen

if httpsend.HttpGetText('https://coinranking.com/', SL) then (geht's weiter)
this function sends the GET method for URL document to an HTTP server. Returned document is in the "Response" stringlist (without any headers). Returns boolean TRUE if all went well.

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: try except

Beitrag von Maik81SE »

fliegermichl hat geschrieben:
Fr 7. Jan 2022, 11:09
Nein, krachen tut da nix. Es bleibt ein Speicherleck übrig.
Dies hab ich in meiner C auch lernen müßen.
Seit dato hab ich es mir peinlich angewöhnt diese auch wieder freizugeben.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Adenos
Beiträge: 67
Registriert: So 17. Okt 2021, 17:18
OS, Lazarus, FPC: Windows 7
CPU-Target: X86
Wohnort: Allgäu

Re: try except

Beitrag von Adenos »

vielen Dank an alle für die wertvollen Hinweise. Ich bin echt froh, dass ich dieses Forum gefunden habe.

Adenos
Beiträge: 67
Registriert: So 17. Okt 2021, 17:18
OS, Lazarus, FPC: Windows 7
CPU-Target: X86
Wohnort: Allgäu

Re: try except

Beitrag von Adenos »

wir haben hier bei uns jeden Tag massive Internetausfälle. Meistens dauert die Unterbrechung nur ein paar Minuten, aber manchmal auch ein paar Stunden. Im Fall der Unterbrechung sollen im Stringgrid die alten Werte stehen bleiben, statt dass das Programm die Schleife durchgeht und alle Felder im StringGrid weiß werden, aber irgendwie schaffe ich das nicht:

Code: Alles auswählen

 
procedure TForm1.CryptoDown;
var
  SL :TStringList;
  X, Y, Preis, Seitentext, Temptext : String;
  Anfang, i, ZeileNr : Integer;
begin
  SL := TStringList.Create;
  if httpsend.HttpGetText('https://coinranking.com/', SL) then
    begin
      SL.SaveToFile(Anwendungsdatenordner+'CryptoKurse.dat');
      StringGridCrypto.RowCount := 51;
      StringGridCrypto.ColWidths[0] := 19;
      StringGridCrypto.Width:=189;
      ShowMessage('down');
      Seitentext := copy(SL.Text, 2, 165000);
      freeandnil(SL);//DeAllocate
      for i := 0 to 49 do
        begin
          StringGridCrypto.Cells[0,(i+1)] := IntToStr(i+1);
          Anfang := Pos('</a> <span class="profile__subtitle">',Seitentext);
          Seitentext := copy(Seitentext, Anfang+40);
          Temptext := Trim(Copy(Seitentext, 1, 14));
          StringGridCrypto.Cells[1,(i+1)] := Temptext;
          Anfang := Pos('$', Seitentext);
          Seitentext := copy(Seitentext, Anfang+20);
          Temptext:=Trim(Copy(Seitentext,1,15));
          Preis:= StringReplace(Temptext, ',', '', [rfReplaceAll]);//löscht alle Kommas
          Preis := StringReplace(Preis,'.', ',',[rfReplaceAll]);//tauscht Punkt in Komma
          StringGridCrypto.Cells[2,(i+1)] := Preis;
        end;
      StringGridCrypto.Cells[0,(0)] := '';
      LabelCoins.Caption:= 'Kryptokurse geladen um '+FormatDateTime('HH:NN',now);
    end;
    ZeileNr:=StringGridCrypto.Cols[1].IndexOf(ACrypto);
    StringGridCrypto.Row:=ZeileNr;
end;
Zuletzt geändert von Adenos am So 9. Jan 2022, 09:46, insgesamt 2-mal geändert.

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: try except

Beitrag von PascalDragon »

Adenos hat geschrieben:
Sa 8. Jan 2022, 09:14
[ code ]
Anmerkung: du musst die Leerzeichen weglassen, damit das Forum das korrekt behandelt.
FPC Compiler Entwickler

Antworten