![]() |
Anfänger: Try&except Problem
Hallo Liebe Community
Ich bin Andreas und neu im Bereich Programmierung, Ich habe gestern angefangen mit "Delphi for Kids" zu lernen und hänge jetzt fest. Wahrscheinlich gibt es für mein Vorhaben elegantere Lösungen, Ich möchte es aber jetzt so versuchen um zu lernen mit den bisher gelernten Syntax zu arbeiten. Mein Programm besteht aus 2 Buttons und 5 Labels. Was es tun soll: Button1: Generiert 2 Zufallszahlen per Randomize; im Zahlenbereich von 0 - 100 und speichert diese in der Integer Variable Zahl1 & Zahl2. Label 1&2: Zeigt den Wert der Variable Zahl1 & Zahl2 an. Label 3&4: Gibt mit einer If Schleife aus ob der Zahlenbereich von Zahl1 und Zahl2 zwischen 0 und 50 ,oder 50 und 100 liegt. Button2: Soll eine Division von Zahl1 und Zahl2 ausführen, dazu soll zunächst im Try Block mit einer If Struktur geprüft werden ob Zahl1 oder Zahl2 = 0 ist, dann nur eine Meldung in Label 5 darüber ausgeben das die Division nicht stattfindet. Wenn dies nicht gegeben ist, soll im except Block Zahl1 und Zahl2 dividiert, in einer real Variable gespeichert und auf Label 5 ausgegeben werden. Und da komme Ich auch zu meinem Problem, Die Anweisungen im Try Block funktionieren problemlos, sobald aber die if Bedingung nicht erfüllt ist werden die Anweisungen im except Block nicht ausgeführt. Ich weiß aber nicht warum. Könnte mir das Jemand erklären? Grüße aus NRW Andreas ps: Hier nochmal der Code:
Delphi-Quellcode:
var
Form1: TForm1; Zahl1 , Zahl2 : Integer; Ergebnis : real; procedure TForm1.Button1Click(Sender: TObject); begin randomize; Zahl1 := random(101); Zahl2 := random(101); Label1.Caption := 'Generierte Zahl 1: ' + IntToStr(Zahl1); Label2.Caption := 'Generierte Zahl 2: ' + IntToStr(Zahl2); if (Zahl1 >= 50) and (Zahl1 < 101) then Label3.Caption := 'Zahlenraum ist zwischen 50 und 100'; if (Zahl1 >= 0) and (Zahl1 < 50) then Label3.Caption := 'Zahlenraum ist zwischen 0 und 50'; if (Zahl2 >= 50) and (Zahl2 < 101) then Label4.Caption := 'Zahlenraum ist zwischen 50 und 100'; if (Zahl2 >= 0) and (Zahl2 < 50) then Label4.Caption := 'Zahlenraum ist zwischen 0 und 50'; end; procedure TForm1.Button2Click(Sender: TObject); begin try if (Zahl1 = 0) or (Zahl2 = 0) then Label5.Caption := 'Zahl 1 oder 2 ist 0, Division nicht möglich'; except Ergebnis := Zahl1 / Zahl2; Label5.Caption := 'Division möglich, Ergebnis: ' + FloatToStrF (Ergebnis, FFNumber, 8, 2); end; end; end. |
Re: Anfänger: Try&except Problem
Woher kommt nur der unsägliche Ausdruck "if-Schleife"? Es gibt KEINE if-Schleifen!
Wozu der try-except Block?
Delphi-Quellcode:
Wobei der Divident auch null sein kann. Nur durch null teilen darf man nicht.
procedure TForm1.Button2Click(Sender: TObject);
begin if (Zahl1 = 0) or (Zahl2 = 0) then begin Label5.Caption := 'Zahl 1 oder 2 ist 0, Division nicht möglich' end else begin Ergebnis := Zahl1 / Zahl2; Label5.Caption := 'Division möglich, Ergebnis: ' + FloatToStrF (Ergebnis, FFNumber, 8, 2); end; end; Wenn du es unbedingt mit einem try-except Block machen willst, lass die if-Bedingung weg:
Delphi-Quellcode:
procedure TForm9.Button1Click(Sender: TObject);
var Zahl1, Zahl2: Integer; begin Zahl1 := StrToInt(Edit1.Text); Zahl2 := StrToInt(Edit2.Text); try Label1.Caption := 'Ergebnis: ' + FloatToStrF(Zahl1 / Zahl2, ffNumber, 8, 2); except On E: EZeroDivide do Label1.Caption := 'Division durch null. Division nicht möglich'; end; end; |
Re: Anfänger: Try&except Problem
Hallo Luckie
Danke für deine Hilfe. Aber so ganz hats mir dann doch nicht geholfen, Ich möchte auf die If-Bedingung nicht verzichten. Habe vorher im Buch, Anhang eines Beispielrpojektes, auch eine If Bedingung in einem Try&Except Block verwendet, da ging alles Problemlos. Ich bin ja Anfänger, und würde jetzt gerne wissen warum mein Except Block nicht ausgeführt wird. Mir jetzt einen Code zu geben der funktioniert, hilft mir zwar dabei mein Programm zum laufen zu kriegen, der Lernfaktor ist aber nicht da. Den Befehl " On E: EZeroDivide do " kenne auch Ich nicht, will ich momentan auch nicht kennen, ich möchte mit den Befehlen mein Programm realisieren die Ich bis jetzt kenne. PS: Ich sagte ja das es da elegantere Lösungen gibt, Ich aber den Syntax anwenden will. If/elese kommt erst in nächsten Abschnitt ;) |
Re: Anfänger: Try&except Problem
Zitat:
warum funktioniert Deine if-Abrfrage mit dem try except Block nicht?. Du baust die Abfrage ja ein, damit es in Deinem Programm zu keinem Problem kommt, wenn Du die Zahl durch null teilst. Normalerweise würde Dein Programm mit einem Laufzeitfehler beendet, nämlich "Division durch null". In dem Programm wird nun eine "Fehlerbehandlung" mit dem Namen EZeroDivide ausgelöst, die zur Anzeige des Fehlers führt. Durch den try except Block sagst Du Deinem Compiler, dass in dem try Bereich vielleicht etwas nicht funktionieren oder schief laufen könnte, in Deinem Beispiel die Division durch null. Der except Block fängt die dort aufgeführten Fehler ab, bei der Version von Luckie genau die Division durch null. Wenn dieser Fehler auftritt, dann gibt er dem Label den Text mit, dass die Division nicht ging. Tritt allerdings kein Fehler auf (Division durch eine Zahl ungleich null), dann wird der except Block auch nicht ausgeführt. Wenn Du in Deinem Programm nochmal genau nachsiehst, wird in Deinem try Block eine if-Abfrage durchgeführt. Die ist soweit korrekt, bzw. auch wenn hier eine Zahl null ist, tritt ja kein Fehler ein, es wird nur die Anweisung hinter dem then ausgeführt. Wenn die Bedingung falsch ist, also beide Zahlen ungleich null sind, dann wird der Befehl hinter dem then übersprungen. Aber ein Fehler, oder genauer eine Exception wird nicht nicht gefeuert und damit wird der except Block nicht durchlaufen. Zur Lösung: Setze doch Deine Abfrage in eine if-then-else Konstruktion:
Delphi-Quellcode:
Achte darauf, hinter der Zeile nach dem then kein Semikolon zu setzen (da falle ich immer wieder darauf rein... komme halt von C/C++). Der Block begin end hinter dem else ist nötig, weil Du mehr als eine Anweisung hast und die dadurch zusammen gefasst werden.
if (Zahl1 = 0) or (Zahl2 = 0) then
Label5.Caption := 'Zahl 1 oder 2 ist 0, Division nicht möglich' else begin Ergebnis := Zahl1 / Zahl2; Label5.Caption := 'Division möglich, Ergebnis: ' + FloatToStrF (Ergebnis, FFNumber, 8, 2); end; Die andere Variante wäre das Beispiel von Luckie. Zitat:
Zitat:
Nur noch zur Logig: Luckie hat es bereits angesprochen, Du brauchst nur auf die Zahl2 zu achten, denn null kann durch irgendetwas außer null geteilt werden, was dann übrig bleibt... Viel Text am Sonntagmorgen, hoffe ich konnte etwas Licht ins dunkle bringen. VG Pixfreak |
Re: Anfänger: Try&except Problem
Zitat:
Wenn du unbedingt ein Exceptblock dort haben willst, musst du es machen wie Luckie es dir schon geschrieben hat. Ansonnsten halt nur mit If-Bedingungen.
Delphi-Quellcode:
if (Zahl1 = 0) or (Zahl2 = 0) then
Label5.Caption := 'Zahl 1 oder 2 ist 0, Division nicht möglich' else begin; Ergebnis := Zahl1 / Zahl2; Label5.Caption := 'Division möglich, Ergebnis: ' + FloatToStrF (Ergebnis, FFNumber, 8, 2); end; Denke aber an das: Zitat:
|
Re: Anfänger: Try&except Problem
Wozu darf Zahl1 nicht 0 sein?
0 / irgendwas ist doch erlaubt/möglich?
Delphi-Quellcode:
if Zahl2 <> 0 then
begin Ergebnis := Zahl1 / Zahl2; Label5.Caption := 'Division möglich, Ergebnis: ' + FloatToStrF (Ergebnis, FFNumber, 8, 2); end else Label5.Caption := 'Zahl 1 oder 2 ist 0, Division nicht möglich'; |
Re: Anfänger: Try&except Problem
|
Re: Anfänger: Try&except Problem
Um man auf die Frage erklärend zu antworten:
Delphi-Quellcode:
bedeutet: versuchte tu_was, wenn dabei was schief geht (z.B. Division durch Null) dann tu_was_anderes
try
tu_was except tu_was_anderes end;
Delphi-Quellcode:
Wie in Code schon beschrieben, will man vielleicht auf unterschiedliche Fehler unterschiedlich reagieren/Fehlermeldungen ausgeben.
try
// hier kann eigentlich nur Zahl1 / Zahl2 schiefgehen // aber was wenn, z.B.: Label nicht inizialisiert worden ist, oder ein anderer Fehler auftritt Label1.Caption := 'Ergebnis: ' + FloatToStrF(Zahl1 / Zahl2, ffNumber, 8, 2); except On E: EZeroDivide do Label1.Caption := 'Division durch null. Division nicht möglich'; end;
Delphi-Quellcode:
gibt dem Fehler einen Namen 'E' und fragt gleich nach der Art des Fehlers 'EZeroDivide' -> Division durch Null
On E: EZeroDivide do
statt: Label1.Caption := ... kann man dann auf E zugreifen und den Systemfehler direkt ausgeben... Wie von anderen schon beantwortet kann durch die if Anweisung aber nie der Fehler 'EZeroDivide' auftreten, da du ihn ja schon abfängst. Es reicht also eins der beiden. Gruß David |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:50 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