AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Try...Except besser verwenden?

Ein Thema von Paul0703 · begonnen am 11. Sep 2009 · letzter Beitrag vom 11. Sep 2009
Antwort Antwort
Paul0703

Registriert seit: 24. Sep 2008
Ort: Halle(Saale)
138 Beiträge
 
Delphi 7 Professional
 
#1

Try...Except besser verwenden?

  Alt 11. Sep 2009, 16:36
Hallo!
Ich habe folgendes Problem:
Ich rufe Werte aus einem Quelltext einer Internetseite ab und verwende diese dann weiter.
Wenn aber kein Zugriff auf das Internet möglich ist,also wenn die Werte leer sind, dann stürzt das Programm ab.

Es geht um folgende Procedure:
Delphi-Quellcode:
procedure TForm1.ThreadedTimer1Timer(Sender: TObject);
var HTMLCode: String;
    TextMessage: TArrayOfString;
    User: TArrayOfString;
    Time: TArrayOfString;
    NameColor: TArrayOfString;
    i: Integer;
    R: Integer;
    G: Integer;
    B: Integer;
    ShortTime: String;
    UserNameColor: TColor;
begin
  Try
    HTMLCode := idHTTP1.Get('http://forum.quicklink.me/chat.php');
    FindInString(HTMLCode, 'class="content" style="min-height: 0px;">', '</div>', False, TextMessage);
    FindInString(HTMLCode, 'class="username-coloured">', '</a></dt>', False, User);
    FindInString(HTMLCode, 'margin: 0px !important;">', '</p>', False, Time);
    FindInString(HTMLCode, '" style="color: ', ';"', False, NameColor);
    LockwindowUpdate(jvRichedit1.Handle);
    Try
      jvRichEdit1.Clear;
      for i := 0 to 9 do
      begin
        If not Form2.CheckBox2.Checked then ShortTime := Copy(Time[i], 17, 7);
        R := StrToInt('$' + Copy(NameColor[i], 2, 2));
        G := StrToInt('$' + Copy(NameColor[i], 4, 2));
        B := StrToInt('$' + Copy(NameColor[i], 6, 2));
        UserNameColor := RGB2TColor(R, G, B);
        If (jvRichEdit1.Color = clblack) and (R = $00) and (G = $00) and (B = $00) then UserNameColor := clwhite;
        If not Form2.CheckBox2.Checked then jvRichEdit1.AddFormatText(User[i] + ' (' + ShortTime + ')' + #13#10, [fsbold, fsUnderline], 'Comic Sans MS', UserNameColor, -12);
        If Form2.CheckBox2.Checked then jvRichEdit1.AddFormatText(User[i] + ' (' + Time[i] + ')' + #13#10, [fsbold], 'Comic Sans MS', UserNameColor, -12);
        If jvRichEdit1.Color = clblack then jvRichEdit1.AddFormatText(UTF8ToAnsi(TextMessage[i]) + #13#10, [], 'Comic Sans MS', clsilver);
        If jvRichEdit1.Color = clwhite then jvRichEdit1.AddFormatText(UTF8ToAnsi(TextMessage[i]) + #13#10, [], 'Comic Sans MS', clblack);
        //Form1.jvRichEdit1.Lines[i] := StringReplace(Form1.jvRichEdit1.Lines[i],' ','BBBBBBBBBBB',[rfreplaceall]);
      end;
    Finally
      LockWindowUpdate(0);
      //Form1.jvRichEdit1.Text := StringReplace(Form1.jvRichEdit1.Text,'a','BBBBBBBBBBB',[rfreplaceall]);
    end;
    If not (CompareString = jvRichEdit1.Lines[0]) then
    if Length(CompareString) > 0 then SoundTime := SoundTime + 1;
    CompareString := jvRichEdit1.Lines[0];
    If SoundTime = StrToInt(Form2.Edit4.Text) then
    begin
      If Form2.RadioButton1.Checked then CoolTrayIcon1.ShowBalloonHint('Q-Chat', 'Neue Nachrichten empfangen!', bitInfo, 10);
      If Form2.RadioButton2.Checked then beep;
      SoundTime := 0;
    end;
  Except
    ShowErrorMessage;
    Form1.Close;
  end;
    TestStatus;
end;
Wenn die Werte die am Anfang abgerufen werden, nicht vefügbar sind, dann stürzt das Programm ab.
Außerdem verursacht dieser Code ein Speicherleck.
Ich denke, ich habe den Code auch falsch aufgebaut mit Try...Execpet, aber ich weiß auch nicht, wie ich das besser machen kann.

Ich hoffe, ihr könnt mir da helfen
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Try...Except besser verwenden?

  Alt 11. Sep 2009, 16:59
Alles was ein Speicherleck auslösen könnte, wird von einem Try-Finally-Block umgeben. Vor dem Try werden die Objekte erzeugt und in Finally freigegeben. Wenn zwischendrin ein Objekt erzeugt wird, baust du an dieser Stelle einen weiteren Try-Finally-Block ein. Für die Fehlerbehandlung kannst du die Blöcke verschachteln, also einen Try-Except-Block in einen Try-Finally-Block einfügen.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Try...Except besser verwenden?

  Alt 11. Sep 2009, 16:59
Mir fällt als erstes auf das du bei betreten des Timerevents den Timer nicht ausschaltest. Zumindest beim normalen Timer kann es dadurch passieren das die Timerprocedure erneut aufgerufen wird bevor sie fertig abgearbeitet wurde. Und in diesem Fall wird versucht "globale" TIdHttp nochmals verwenden obwohl es vielleicht gerade dabei ist Arbeit zu verrichten.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#4

Re: Try...Except besser verwenden?

  Alt 11. Sep 2009, 17:03
Typen für Speicherlecks kann ich hier eigentlich nicht finden, da bei Strings und dynamischen Arrays eigentlich Delphi für's aufräumen sorgt.
Ich würde da erstmal das Speicherleck in den anderen Funktionen/Klassen sehen, welche hier aufgerufen werden.

Was das "dann stürzt das Programm ab" angeht.
Trenne die Internetverbindung und gehe diesen Code im Einzelschritt durch und schau wo er abstürtzt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Paul0703

Registriert seit: 24. Sep 2008
Ort: Halle(Saale)
138 Beiträge
 
Delphi 7 Professional
 
#5

Re: Try...Except besser verwenden?

  Alt 11. Sep 2009, 17:54
Danke für die vielen Antworten!
Ich habe jetzt mal am Anfang der TimerProcedure den Timer ausgeschlaltet und am Ende wieder an. Jetzt stürzt das Programm zwar nicht ab, aber es kommt auch keine Fehlermeldung, also es passiert gar nichts

Und FastMM hat jetzt folgende Meldung gebracht, als ich es über die IDE gestartet habe(nur dann) und der prozess blieb jedes Mal offen.

---------------------------
Project1.exe: Memory Leak Detected
---------------------------
This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer):



21 - 28 bytes: TCriticalSection x 1



Note: To obtain a log file containing detail on memory leaks, enable the "FullDebugMode" and "LogMemoryLeakDetailToFile" conditional defines. To disable this memory leak check, undefine "EnableMemoryLeakReporting".


---------------------------
OK
---------------------------

Wenn ich den Timer abstelle, geht alles, dann ist auch das leck weg, nur brauche ich ja den Timer und alles was er ausführt
Vielleicht könnt ihr nochmal erklären, wie ich das verschachteln kann
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz