Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Anfänger: Try&except Problem (https://www.delphipraxis.net/150977-anfaenger-try-except-problem.html)

RunningUp 2. Mai 2010 00:49


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.

Luckie 2. Mai 2010 01:09

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:
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;
Wobei der Divident auch null sein kann. Nur durch null teilen darf man nicht.

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;

RunningUp 2. Mai 2010 01:32

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 ;)

pixfreak 2. Mai 2010 07:23

Re: Anfänger: Try&except Problem
 
Zitat:

Zitat von RunningUp
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.

Moin RunningUp,

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:
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;
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.

Die andere Variante wäre das Beispiel von Luckie.

Zitat:

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.
Das ist nichts anderes, als der Fehler, der beim teilen durch null auftritt. Und durch das On im except Block wird dieser Fehler abgefangen.

Zitat:

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 ;)
Hmm, ohne if/else oder das Abfangen einer Exception wird es schwer. Eine Möglichkeit wäre das setzen des Labels, dass es nicht geht und in der if-Abfrage prüfen, ob die Zahlen ungleich null sind. Wenn ja, dann das Label mit dem Ergebnis noch einmal überschreiben. Nicht schön, daher lese doch in Deinem Buch ruhig mal einen Abschnitt weiter und überdenke dann Dein Programm noch einmal. Ich denke, dass wird helfen.

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

lbccaleb 2. Mai 2010 07:25

Re: Anfänger: Try&except Problem
 
Zitat:

Zitat von RunningUp
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.


Delphi-Quellcode:
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.

Das geht so nicht, da der Except Block nur ausgeführt wird, wenn bei deiner if-Bedingung ein Fehler auftritt.
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:

Zitat von Luckie
Wobei der Divident auch null sein kann. Nur durch null teilen darf man nicht.

Nen bissel spät oO

himitsu 2. Mai 2010 07:34

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';

Florian Hämmerle 2. Mai 2010 09:01

Re: Anfänger: Try&except Problem
 
Crosslink DT

mfg Florian

David Martens 2. Mai 2010 13:47

Re: Anfänger: Try&except Problem
 
Um man auf die Frage erklärend zu antworten:

Delphi-Quellcode:
try
  tu_was
except
  tu_was_anderes
end;
bedeutet: versuchte tu_was, wenn dabei was schief geht (z.B. Division durch Null) dann tu_was_anderes

Delphi-Quellcode:
  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;
Wie in Code schon beschrieben, will man vielleicht auf unterschiedliche Fehler unterschiedlich reagieren/Fehlermeldungen ausgeben.

Delphi-Quellcode:
On E: EZeroDivide do
gibt dem Fehler einen Namen 'E' und fragt gleich nach der Art des Fehlers 'EZeroDivide' -> Division durch Null
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