Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [Quiz] wann darf auf ein Semikolon ein ELSE folgen? (https://www.delphipraxis.net/184517-%5Bquiz%5D-wann-darf-auf-ein-semikolon-ein-else-folgen.html)

Popov 1. Apr 2015 17:45

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Zu welcher dieser On-Bedingungen würde das Else gehören? Beispiel aus: http://www.delphipraxis.net/184526-%...ml#post1295838
Delphi-Quellcode:
program FunWithDelphi;
 
{$APPTYPE CONSOLE}
 
uses
  Controls, SysUtils;
 
begin
  try
    raise TMouse.Create;
  except
    on E:Exception do
    begin
      Writeln(E.Classname, ': E is Exception');
    end;
    on E:TObject do
    begin
      Writeln(E.Classname, ': E is TObject');
    end;
    on E:TMouse do
    begin
      Writeln(E.Classname, ': E is TMouse');
    end;
  end;
  ReadLn;
end.
Hier ein anderes Beispiel:
Delphi-Quellcode:
var
  t: TDateTime;
  a: Integer;
begin
  try
    t := StrToDate('40.01.2015');
    ShowMessage(DateToStr(t));

    a := 5;
    ShowMessage(IntToStr(10 div (a-5)));
  except
    on E:EDivByZero do
      ShowMessage('Division durch Null.');
  else
    ShowMessage('Sonstige Fehler.');
  end;
end;
Division durch Null wird im Except-Block ausgeführt. Fallen sonstige Fehler an, werden die in Else abgearbeitet.

Übrigens, wusste ich bisher auch nicht, aber On..funktioniert im Except-Block nur wenn sonst keine Anweisungen in dem Block vorhanden sind. Das klappt also nicht:
Delphi-Quellcode:
var
  t: TDateTime;
  a: Integer;
begin
  try
    t := StrToDate('40.01.2015');
    ShowMessage(DateToStr(t));

    a := 5;
    ShowMessage(IntToStr(10 div (a-5)));
  except
    on E:EDivByZero do
      ShowMessage('Division durch Null.');

    ShowMessage('Sonstige Fehler.');
  end;
end;
Geht nicht. Wird gar nicht erst kompiliert.

himitsu 1. Apr 2015 17:52

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Viele ON's sind wie ein if-then-else-if-then-else und das letzte ELSE ist das besagte ELSE.
PS: ELSE gibt es dort nur, wenn vorher ein ON steht.



Jupp, entweder ON oder nicht ... gemischt geht nicht,
aber da
Delphi-Quellcode:
on e: irgendwas do begin ... end
einem
Delphi-Quellcode:
if ExceptObject is irgendwas then begin var E := ExceptObject as irgendwas; ... end;
entspricht, kann man das auch selber machen.


Ich schiebe ELSE "immer" auf Höhe vom Beginn des öffnenden Befehls (IF), bzw. der gleichwertigen Geschwister (im CASE und EXCEPT).
Genauso wie beim END, wobei ich hier END-ELSE-BEGIN in eine Zeile schiebe (BEGIN hinter den Befehl)

Aber jedem das Seine.


Es gibt nur Einwas, wo das alles nicht hilft und man immer eine Ausnahme machen muß .... Beim fehlenden End in den varianten Teilen des Records. :wall:
Dieses End sollte man endlich mal reparieren ... man kann das nicht ordentlich verschachteln und vorallem nix dahinter legen, wie in jeder anderen Sprache auch.

BadenPower 1. Apr 2015 18:18

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Zitat:

Zitat von Popov (Beitrag 1295858)
Hier ein anderes Beispiel:
Delphi-Quellcode:
var
  t: TDateTime;
  a: Integer;
begin
  try
    t := StrToDate('40.01.2015');
    ShowMessage(DateToStr(t));

    a := 5;
    ShowMessage(IntToStr(10 div (a-5)));
  except
    on E:EDivByZero do
      ShowMessage('Division durch Null.');
  else
    ShowMessage('Sonstige Fehler.');
  end;
end;
Division durch Null wird im Except-Block ausgeführt. Fallen sonstige Fehler an, werden die in Else abgearbeitet.

Wenn der Fehler nicht "EDivByZero" dann ELSE!

Also so:

Delphi-Quellcode:
var
  t: TDateTime;
  a: Integer;
begin
  try
    t := StrToDate('40.01.2015');
    ShowMessage(DateToStr(t));

    a := 5;
    ShowMessage(IntToStr(10 div (a-5)));
  except
    on E:EDivByZero do
      ShowMessage('Division durch Null.');
    else
      ShowMessage('Sonstige Fehler.');
  end;
end;

Popov 1. Apr 2015 18:30

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Grundregel bei Pascal: bei Semikolon ist eine Anweisung zu ende. Da folgt nichts mehr. Da ist Schluss.
Delphi-Quellcode:
    on E:EDivByZero do
      ShowMessage('Division durch Null.');
Wie kann also nach dem Ende noch etwas folgen?

Außerdem, wieso funktioniert das nicht?
Delphi-Quellcode:
  try
    ...
  except
    ShowMessage('Hallo.');

    on E:EDivByZero do
      ShowMessage('Division durch Null.');
    else
      ShowMessage('Sonstige Fehler.');
  end;
Wenn Else zu On gehört, dann müsste es dem Except-Block egal sein ob es vorher noch ein Hallo sagt.

Neutral General 1. Apr 2015 19:04

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Zitat:

Zitat von Popov (Beitrag 1295863)
Grundregel bei Pascal: bei Semikolon ist eine Anweisung zu ende. Da folgt nichts mehr. Da ist Schluss.
Delphi-Quellcode:
    on E:EDivByZero do
      ShowMessage('Division durch Null.');
Wie kann also nach dem Ende noch etwas folgen?

Außerdem, wieso funktioniert das nicht?
Delphi-Quellcode:
  try
    ...
  except
    ShowMessage('Hallo.');

    on E:EDivByZero do
      ShowMessage('Division durch Null.');
    else
      ShowMessage('Sonstige Fehler.');
  end;
Wenn Else zu On gehört, dann müsste es dem Except-Block egal sein ob es vorher noch ein Hallo sagt.

Das ist irrelevant weil ganz generell vor dem "on" keine Anweisung sein darf. Auch ohne else nicht.

himitsu 1. Apr 2015 19:06

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Das wurde doch schon gesagt?

Von Try-Except gibt es quasi zwei Varianten:
* mit den ON-DO-ELSE-Bedingungen
* und ohne

Ja, beim ; ist ein "Befehl" zuende ... beim CASE und EXCEPT-ON ist EXCEPT-END und CASE-OF-END nur der Container
und das da drinnen sind die enthaltenen Befehle/Bedingungen, welche "jeweils" mit ; enden.
Drum wird ON und ELSE auch eingerückt. :angle2:

Namenloser 1. Apr 2015 19:11

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Wie kann man denn ernsthaft der Meinung sein, dass das
Delphi-Quellcode:
else
auf die gleiche Stufe wie das
Delphi-Quellcode:
except
gehört? :shock: Das ist für mich völlig absurd. Oder ist das ein Aprilscherz?

Auf jeden Fall kann man da bestimmt einen wunderbaren Flamewar drüber entfachen.

BadenPower 1. Apr 2015 19:11

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Zitat:

Zitat von himitsu (Beitrag 1295868)
Drum wird ON und ELSE auch eingerückt. :angle2:

:thumb::thumb::thumb:

Popov 1. Apr 2015 19:37

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Zitat:

Zitat von Neutral General (Beitrag 1295867)
Das ist irrelevant weil ganz generell vor dem "on" keine Anweisung sein darf. Auch ohne else nicht.

Die Frage ist: warum nicht? Ändert ein On die Pacal-Regeln innerhalb eines Blocks? Oder ist es so, dass
Delphi-Quellcode:
try..except..end;
und
Delphi-Quellcode:
try..except..else..end;
nicht das Gleiche sind und beim Zweiten nur Ons im Except-Block akzeptiert werden?

Auf der anderen Seite - ich denke so wichtig ist das nun auch wieder nicht.
Zitat:

Zitat von himitsu (Beitrag 1295868)
Von Try-Except gibt es quasi zwei Varianten:
* mit den ON-DO-ELSE-Bedingungen
* und ohne

Ist es dein Beitrag zum 1. April und morgen kommst du mit April, April an?
Zitat:

Zitat von Namenloser (Beitrag 1295870)
Wie kann man denn ernsthaft der Meinung sein, dass das
Delphi-Quellcode:
else
auf die gleiche Stufe wie das
Delphi-Quellcode:
except
gehört?

Delphi Hilfe meint es:
Zitat:

Zitat von Delphi-Hilfe
Delphi-Quellcode:
try
 ...
except
  on EZeroDivide do HandleZeroDivide;
  on EOverflow do HandleOverflow;
  on EMathError do HandleMathError;
else
  HandleAllOthers;
end;

Wikibook.org meint es:
Zitat:

Zitat von wikibook.org
Delphi-Quellcode:
try
  <unsichere Anweisungen>
except
  on <Exception> do
    <Anweisung>
  [on <Exception> do
    <Anweisung>]
  ...
else
  <Anweisungen>
end;

Delphi-Tref meint es
Zitat:

Zitat von delphi-treff.de
Delphi-Quellcode:
except
  on EZeroDivide do ...;
  on EMathError do ...;
  on EMyError do ...;
else
  ...;
end;

Popov meint es.

himitsu 1. Apr 2015 19:42

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Die haben es alle einfach untereinander und von jemandem kopiert, der es falsch machte. :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 Uhr.
Seite 3 von 4     123 4      

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