![]() |
Fehler Abfangen (stringkonvertierung)
Hi
ich beschäftige mich noch nich lang mit delphi, und bin jetzt an dem Punkt wo ich mich intensiv um fehlerbehandlung kümmern will/muß. konkretes problem: ich lese Daten aus einer asci datei. dazu lese ich diese zeilenweise ein, zerhacke die zeilen mit dem copy befehl und schreibe dann die daten in eine tabelle. nun weiß ich, das
Delphi-Quellcode:
zu 99% der fälle geht, weil an besagter stelle halt zahlen hingehören. es gab aber ausnahmen. also behalf ich mir mit
Table1RZM.Value := StrToInt((copy(zeile,261,3)))
Delphi-Quellcode:
das schafft abhilfe. wenn nun aber an besagter Stelle buchstaben stehen kommt die fehlermeldung "ist kein gültiger integerwert" ..is ja logisch. wie kann ich dem compiler sagen: "heul nich wenns kein gültiger integer wert is, sondern knick die konvertierzung undlass das feld dann einfach leer"
if copy(daten,261,3) <> ' ' then Table1RZM.Value := StrToInt((copy(daten,261,3)));
|
Re: Fehler Abfangen (stringkonvertierung)
entweder in eine try..except anweisung
oder statt strtoint einfach StrToIntDef('text', 0); wird dann der Wert zurückgegben, fals der Text nicht umgewandelt werden kann. |
Re: Fehler Abfangen (stringkonvertierung)
Delphi-Quellcode:
Mist, zu langsam :shock:
StrToIntDef(copy(daten,261,3)),0);
|
Re: Fehler Abfangen (stringkonvertierung)
Das Problem an StrToIntDef ist aber, dass man einen Wert braucht, der auf gar keinen Fall ein gültiger Wert ist. Denn wenn der String-Wert auch '0' sein darf (also die Zahl gleich 0), dann könnte eine 0 im Falle von StrToIntDef(bla, 0) entweder bedeuten, dass es keine Zahl war oder dass der String die Entsprechung der Zahl 0 war. In so einem Fall ist ein try..except-Block sicherer, aber nicht schneller. Ich würde dann die Funktion
![]() |
Re: Fehler Abfangen (stringkonvertierung)
Delphi-Quellcode:
damit gehts...wars das schon? Wenn ich beim except nix reinschreib ignoriert er die fehler, richtig? Meine frage: versucht er jedes statement des try blocks auszuführen? soll heißen, wenn die erste strink konvertzierung fehlschlägt, macht er dann trotzdem die zweite und das post?
try
Table1RZM.Value := StrToInt(copy(daten,231,3)); Table1RZG.Value := StrToInt(copy(daten,911,3)); Table1.Post; except end; |
Re: Fehler Abfangen (stringkonvertierung)
und nochwas: zur entwicklungszeit bekomm ich die fehler ja immernoch..kann ich das abstellen?
|
Re: Fehler Abfangen (stringkonvertierung)
try..except-Blöcke funktionieren so: Er arbeitet die Anweisungen Schritt für Schritt ab. Wenn eine Execption hervorgerufen wird, wird der Code im except-Block ausgeführt. Das Post würde also nur ausgeführt werden, wenn keine Exception auftrat.
Es gibt aber auch ein Konstrukt, das Code ausführt, egal ob eine Exception aufgetreten ist oder nicht: try..finally. In Verbindung mit try..except sähe das so aus:
Delphi-Quellcode:
Hier wird Table1.Post auf jeden Fall ausgeführt.
try
try Table1RZM.Value := StrToInt(copy(daten,231,3)); Table1RZG.Value := StrToInt(copy(daten,911,3)); finally Table1.Post; end; except //hier Fehlerbehandlung end; Wegen der Exceptions zur Entwicklungszeit: Tools->Debugger-Optionen->Bei Exceptions stoppen (oder so ähnlich) |
Re: Fehler Abfangen (stringkonvertierung)
Ich würd TryStrToInt bevorzugen, hat man keine unnötigen ausnahmen, in einer angelegenheit die eigentlich keine ausnahmen erfordert:
Delphi-Quellcode:
ohne das man das betriebssystem damit belästigen muss :wink:
var i:integer;
... if TryStrToInt('0oo1',i) then bla := i; |
Re: Fehler Abfangen (stringkonvertierung)
Also mein Delphi5 kennt kein TryStrToInt. Vielleicht gibts das erst seit Delphi8?
|
Re: Fehler Abfangen (stringkonvertierung)
Seit D7 glaube ich dabei.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz