AGB  ·  Datenschutz  ·  Impressum  







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

Anfänger: Try&except Problem

Ein Thema von RunningUp · begonnen am 2. Mai 2010 · letzter Beitrag vom 2. Mai 2010
Antwort Antwort
RunningUp
(Gast)

n/a Beiträge
 
#1

Anfänger: Try&except Problem

  Alt 2. Mai 2010, 00:49
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Anfänger: Try&except Problem

  Alt 2. Mai 2010, 01:09
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;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
RunningUp
(Gast)

n/a Beiträge
 
#3

Re: Anfänger: Try&except Problem

  Alt 2. Mai 2010, 01:32
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
  Mit Zitat antworten Zitat
pixfreak

Registriert seit: 6. Jul 2007
112 Beiträge
 
Delphi XE3 Professional
 
#4

Re: Anfänger: Try&except Problem

  Alt 2. Mai 2010, 07:23
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
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Anfänger: Try&except Problem

  Alt 2. Mai 2010, 07:25
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 von Luckie:
Wobei der Divident auch null sein kann. Nur durch null teilen darf man nicht.
Nen bissel spät oO
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: Anfänger: Try&except Problem

  Alt 2. Mai 2010, 07:34
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';
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Florian Hämmerle
(Gast)

n/a Beiträge
 
#7

Re: Anfänger: Try&except Problem

  Alt 2. Mai 2010, 09:01
Crosslink DT

mfg Florian
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#8

Re: Anfänger: Try&except Problem

  Alt 2. Mai 2010, 13:47
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.

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
  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 18:43 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