Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bei try..except Zeilenr. der fehlerhaften Zeile ausgeben? (https://www.delphipraxis.net/88674-bei-try-except-zeilenr-der-fehlerhaften-zeile-ausgeben.html)

mkinzler 19. Mär 2007 11:53

Re: Bei try..except Zeilenr. der fehlerhaften Zeile ausgeben
 
Zitat:

Kann man das irgendwo festlegen ob Punkt oder Komma verwendet werden soll?
Ja durch setzen der Konstanten DecimalSeparator bzw ThousandSeparator oder durch Verwendung der Funktion überladenen StrToFloat-Funktion

himitsu 19. Mär 2007 12:04

Re: Bei try..except Zeilenr. der fehlerhaften Zeile ausgeben
 
Zitat:

Zitat von KoS
Hmm, ich war bisher immer der Meinung das klappt mit dem Punkt, das kann aber sein das die Werte alle keine Nachkommastelle hatten.

Delphi ignoriert praktischer Weise die lokalen Einstellungen.
Im QuellCode ist "." der Dezimaltrenner.
(wäre och blög, wenn der Deutsche keine englischen Progamme kompilieren könnte :stupid: )

Zitat:

Zitat von KoS
Kann man das irgendwo festlegen ob Punkt oder Komma verwendet werden soll? Wenn das Programm auf einem englischem System läuft würde ja dann wieder ne Exception kommen.

Ja, die Einstellungen werden beim Programmstart ausgelesen und dann lokal in den entspechenden Variablen abgespeichet, welche du natürlich auch selber ändern/setzen kannst.

siehe Delphi-Referenz durchsuchenDecimalSeparator und Tausendertrenne, oder eben die passende Delphi-Referenz durchsuchenStrToFloat

KoS 19. Mär 2007 12:31

Re: Bei try..except Zeilenr. der fehlerhaften Zeile ausgeben
 
Das weicht jedoch alles vom eigentlichen Thema ab.

@IngoD7: Es ist ja nicht so das ich nur auf Grund dieses Fehlers ein Exception bekomme. Das war halt jetzt 1 Fehler der mir aufgefallen ist und wo ich vielleicht von der Programmierung her etwas unwissentlich gehandelt habe. Zumal eben Delphi intern mit '.' rechnet.

Muetze1 19. Mär 2007 12:40

Re: Bei try..except Zeilenr. der fehlerhaften Zeile ausgeben
 
Um das angesprochene Problem zu beheben, nutze ich immer einen solchen (oder ähnlich gelagerten) Code:

Delphi-Quellcode:
Function MyStrToFloat(AString: String): Float;
Begin
  AString := StringReplace(AString, '.', DecimalSeparator, []);
  AString := StringReplace(AString, ',', DecimalSeparator, []);
  Result := StrToFloat(AString);
End;

shmia 19. Mär 2007 13:00

Re: Bei try..except Zeilenr. der fehlerhaften Zeile ausgeben
 
Delphi erzeugt ja gerne mal Exceptions, die so allgemein sind, dass der Benutzer nichts damit anfangen kann. (z.B. "ungültige Variantumwandlung")
Hier muss man als Programmierer mitdenken und an strategisch günstigen Stellen die Exception abfangen, erweitern und neu auslösen:
Delphi-Quellcode:
procedure TForm1.ButtonImport(Sender:TObject);
begin
   if FileDialog1.Execute then
   begin
      try
         ImportXMLfile(FileDialog1.Filename);
      except
         on E:Exception do
         begin
            // sinn- und gehaltvolle Fehlermeldung bilden
            E.Message := 'XML - Import'#13#10+
               'Fehler beim Importieren der Datei <'+FileDialog1.Filename+'>'#13#10+
               E.Message; // auf jeden Fall die orginale Meldung anhängen !!
            Raise; // Exception erneut auslösen
         end;
      end;
   end;
end;
Man hütte sich davor, anstelle von Raise etwa ShowMessage zu verwenden. :warn:
Mit dieser Technik kann man Programme schreiben, die jederzeit präzise Fehlermeldungen ausgeben,
mit denen sowohl der Benutzer, als auch der Programmierer etwas anfangen kann.

Sinnvoll lässt sich diese Technik auch innerhalb von Schleifen einsetzen:
Delphi-Quellcode:
for i := 0 to stringlist.Count-1 do
begin
   try
     ImportCSVdaten(stringlist[i]);
   except
      on E:Exception do
      begin
         E.Message := Format('Fehler in Zeile %d'#13#10, [i])+
            E.Message;
         raise;
      end;
   end;
end;

LAWn-M0W3R 19. Mär 2007 14:16

Re: Bei try..except Zeilenr. der fehlerhaften Zeile ausgeben
 
Tach,
um mal wieder auf das Anfangsthema zurückzukommen:
Delphi-Quellcode:
try
 //fehlerhafter Quelltext
except
 Assert(false,'Fehler SoUndSo');
end;
Die Fehlerausgabe sieht dann ungefähr so aus:
Zitat:

Fehler SoUndSo (D:\new\Unit1.pas, Zeile 34)
Achtung: Nicht wundern, in Delphi werden natürlich die normalen Compiler-Fehler ausgegeben, aber wenn du dann die kompilierte EXE unabhängig von Delphi startest, dann bekommst du deine Exception wie oben angegeben!

Grüße
der MAX

KoS 19. Mär 2007 15:40

Re: Bei try..except Zeilenr. der fehlerhaften Zeile ausgeben
 
Kann man das Assert() auch in die Logfile bzw. in ne String-Variable lenken?
Da es ja ein Dienst ist sollte es nicht als MsgBox oder derartiges kommen.

Als ich mit dem Assert mal kurz gespielt hab ist mir aufgefallen, das immer genau die Zeile ausgegeben wird in der das Assert(false) ist. Irgendwie bringt mich das dann im Except auch nicht weiter weil ich ja anfänglich sagte, das der try-Block recht groß ist und ich ja die Zeile von dem Fehler und nicht von dem Exception brauche.

Bleibt mir wohl wirklich nix anderes übrig als nach eine der Bereits genannten Lösungen vorzugehen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:37 Uhr.
Seite 3 von 3     123   

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