Delphi-PRAXiS

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)

mjustin 1. Apr 2015 10:29

Delphi-Version: 2009

[Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
In Object Pascal / Delphi ist es in bestimmten Konstrukten erlaubt, unmittelbar nach einem Semikolon ein else zu verwenden.

Delphi-Quellcode:
<Statement>;
else (...)
Normalerweise ist else nach einem Semikolon nicht möglich und führt zu einer Fehlermeldung beim Kompilieren.
Um welche Konstrukte handelt es sich, bei dem auf ein Semikolon ein else folgen kann?

Update: es gibt mindestens zwei Konstrukte. Das case Konstrukt wurde bereits unten genannt, welches gibt es noch?

mkinzler 1. Apr 2015 10:32

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Bei else vom CASE-Konstrukt ( hiess ursprünglich auch OTHERWISE)

Nanaki 1. Apr 2015 10:32

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Delphi-Quellcode:
case eingabe of
 1: ausgabe := 'Sie haben 1 eingegeben';
 2: ausgabe := 'Sie haben 2 eingegeben';
 3: ausgabe := 'Sie haben 3 eingegeben';
 else ausgabe := 'Sie haben nicht 1, 2 oder 3 eingegeben';
end;


Hier

Edit: Ohhh zu spät

mjustin 1. Apr 2015 10:40

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Danke für die Antworten soweit! Es gibt allerdings noch ein weiteres Konstrukt bei dem nach einem Semikolon ein else folgen kann. Wer kennt es?

Der schöne Günther 1. Apr 2015 10:44

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
try..except..else?

Delphi-Quellcode:
begin
   try
      WriteLn( 'Hallo Welt'.ToInteger() );
   except
      on EConvertError do
         WriteLn('Ein zahlenloser Tag');
   else
         WriteLn('Das Programm ist fehlerhaft. Tauschen sie es um.');
   end;
end.

mjustin 1. Apr 2015 11:37

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

Zitat von Der schöne Günther (Beitrag 1295757)
try..except..else?

Ja, allerdings würde ich persönlich die Einrückung anders als in der Delphi Dokumentation setzen. In der Delphi Dokumentation wird das else auf die Ebene des except gesetzt:
Delphi-Quellcode:
try
  ...
except
  on EZeroDivide do HandleZeroDivide;
  on EOverflow do HandleOverflow;
  on EMathError do HandleMathError;
else
  HandleAllOthers;
end;
Dagegen würde ich diese Einrückung bevorzugen:
Delphi-Quellcode:
begin
   try
      WriteLn( 'Hallo Welt'.ToInteger() );
   except
      // eine Folge von Exception-Behandlungsroutinen, optional mit nachfolgendem else
      on EConvertError do
         WriteLn('Ein zahlenloser Tag');
      else
         WriteLn('Das Programm ist fehlerhaft. Tauschen sie es um.');
   end;
end.
http://docwiki.embarcadero.com/RADSt.../de/Exceptions
Zitat:

ExceptionBlock ist entweder
eine weitere Anweisungsfolge oder
eine Folge von Exception-Behandlungsroutinen, optional mit nachfolgendem else Anweisungsliste

Namenloser 1. Apr 2015 12:42

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Gab es nicht noch irgendeinen Fall mit Verschachtelung? :gruebel:

Delphi-Quellcode:
  if a then
    if b then
      foo;
  else
    bar;
Das scheint es aber nicht zu sein... zumindest nicht unter FreePascal.

himitsu 1. Apr 2015 13:25

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

Zitat von Namenloser (Beitrag 1295779)
Gab es nicht noch irgendeinen Fall mit Verschachtelung? :gruebel:

Ich glaub fast ja njö. Das Semikolon gehört ja zum inneren IF und das äußere IF wäre noch nicht beendet,
aber eigentlich sollte ; alles beenden, denn sonst müsste man ja bei
Delphi-Quellcode:
if ... then ... else if ... then ... else if ... then ... else ...;;;


Aber grundsätzlich sollte ELSE nur beim CASE auf ; folgen, denn dort beendet das ; den jeweiligen Case-Block und ELSE folgt auf das ganze CASE-OF.
Und Try-Except ist quasi ein CASE.

Popov 1. Apr 2015 13:40

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

Zitat von mjustin (Beitrag 1295754)
Danke für die Antworten soweit! Es gibt allerdings noch ein weiteres Konstrukt bei dem nach einem Semikolon ein else folgen kann. Wer kennt es?

Ich würde trotz dem Kein sagen, denn vor Else kann im Grunde kein Semikolon stehen. Ich bin zwar kein Pascal-Crack, aber paar Regeln kenne ich dann doch: jede Anweisung muss/wird in einem Block ausgeführt und das Semikolon gibt das Ende der Anweisung oder Blocks an.

Somit gibt es vor diesen Else kein Semikolon:
Delphi-Quellcode:
case eingabe of
 1: ausgabe := 'Sie haben 1 eingegeben';
 2: ausgabe := 'Sie haben 2 eingegeben';
 3: ausgabe := 'Sie haben 3 eingegeben';
 else ausgabe := 'Sie haben nicht 1, 2 oder 3 eingegeben';
end;
denn auch wenn hier kein
Delphi-Quellcode:
begin..end
Block zwischen
Delphi-Quellcode:
case..of
und
Delphi-Quellcode:
else
steht,
Delphi-Quellcode:
case..of
und
Delphi-Quellcode:
else
sind ein Block.
Delphi-Quellcode:
case..of
wird mit einem
Delphi-Quellcode:
end;
abgeschlossen, nicht mit einem Semikolon wie bei einer If-Abfrage. Also, entweder bilden
Delphi-Quellcode:
case..of
und
Delphi-Quellcode:
else
einen Block oder
Delphi-Quellcode:
case..of
und
Delphi-Quellcode:
end;
. Womit es egal ist ob hier vor
Delphi-Quellcode:
else
ein Semokolon steht, denn das hat keinen Einfluß auf
Delphi-Quellcode:
else
. Denn das Semikolon ist in einem Block eingeschlossen.

Wo gibt es Blocks?
Delphi-Quellcode:
begin..end;
repeat..until
while..end;
try..except..else..end;
case..of..else..end;
usw.
Bei
Delphi-Quellcode:
case..of..else
bilden
Delphi-Quellcode:
case..of
und
Delphi-Quellcode:
else
einen Block, genau wie
Delphi-Quellcode:
begin
und
Delphi-Quellcode:
end
. Das Gleiche gilt für
Delphi-Quellcode:
try..except..else
. Somit sind das keine Ausnahmen, denn
Delphi-Quellcode:
except..else
bilden einen Block wie
Delphi-Quellcode:
begin..end
.

Bei
Delphi-Quellcode:
if..then..else
ist das anders.
Delphi-Quellcode:
if..then else
bilden keinen Block. Pascal geht somit davon aus, dass wenn zwischen
Delphi-Quellcode:
then
und
Delphi-Quellcode:
else
kein
Delphi-Quellcode:
begin..end
Block steht, es sich um eine einzelne Anweisung handelt. Und da man
Delphi-Quellcode:
if..then
mit und ohne
Delphi-Quellcode:
else
ausführen kann, sagt das Semikolon, dass hier die Abfrage zu ende ist. Wenn dann in der nächsten Zeile ein
Delphi-Quellcode:
else
auftaucht, dann ist es eine undefinierte Anweisung.

Der schöne Günther 1. Apr 2015 15:40

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

Zitat von mjustin (Beitrag 1295769)
Ja, allerdings würde ich persönlich die Einrückung anders als in der Delphi Dokumentation setzen

Ich verstehe deine Motivation dafür nicht. Das Delphi-Doku-Beispiel ist doch super-übersichtlich und zeigt glasklar ein "Bei speziell A: Tue dies. Bei speziell B: Tue das. ANSONSTEN tue das".

Auch das Syntax-Highlighting beim cnPack (Castalia wahrscheinlich auch) färbt es nach dieser Logik ein.


Außerdem: Du drückst dich. Wo ist mein Preis?

mjustin 1. Apr 2015 16:10

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

Zitat von Der schöne Günther (Beitrag 1295820)
"Bei speziell A: Tue dies. Bei speziell B: Tue das. ANSONSTEN tue das".

Durch Nanaki's Codebeispiel fühlte ich mich einen Augenblick in meinem abweichenden Stil unterstützt aber im Docwiki wird bei case und except jeweils das else in gleicher Weise eingerückt, das kann kein Zufall sein :)[/QUOTE]

Zitat:

Zitat von Der schöne Günther (Beitrag 1295820)
Außerdem: Du drückst dich. Wo ist mein Preis?

Oh, stimmt, den hatte ich ganz vergessen :oops:

<promotion>Ich vergebe gerne eine kostenlose Single Developer Lizenz mit Sourcecode meines Web Frameworks (Habari Web Components)</promotion>

Der schöne Günther 1. Apr 2015 16:16

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Also haben wir jetzt beide Fälle abgeschlossen oder gibt es noch einen dritten?

Und: Wann kommt das nächste Rätsel? Mir hat das Spaß gemacht.

Neutral General 1. Apr 2015 16:56

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

Zitat von Der schöne Günther (Beitrag 1295820)
Zitat:

Zitat von mjustin (Beitrag 1295769)
Ja, allerdings würde ich persönlich die Einrückung anders als in der Delphi Dokumentation setzen

Ich verstehe deine Motivation dafür nicht. Das Delphi-Doku-Beispiel ist doch super-übersichtlich und zeigt glasklar ein "Bei speziell A: Tue dies. Bei speziell B: Tue das. ANSONSTEN tue das".

Auch das Syntax-Highlighting beim cnPack (Castalia wahrscheinlich auch) färbt es nach dieser Logik ein.

Naja ganz einfach: In der Delphi Doku sieht es so aus als würde das else zum except gehören obwohl es (in meinen Augen) ein else zu den on-do Blöcken ist und daher auch auf diese Ebene gehört und nicht auf die Ebene des except.

Popov 1. Apr 2015 16:59

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

Zitat von mjustin (Beitrag 1295827)
aber im Docwiki wird bei case und except jeweils das else in gleicher Weise eingerückt, das kann kein Zufall sein :)

Wenn dem so ist, dann ist es falsch. Else wird niemals eingerückt, da es z. B. bei der If-Anweisung bei Else um ein Teil der
Delphi-Quellcode:
if...then...else
Anweisung handelt. Else ist keine Unteranweisung, womit das mit Else so aussieht:
Delphi-Quellcode:
if...then
  Anweisung1
else
  Anweisung2;
Es sieht niemals so aus:
Delphi-Quellcode:
if...then
  Anweisung1
  else
  Anweisung2;
oder so:
Delphi-Quellcode:
if...then
  Anweisung1
    else
  Anweisung2;
Mit Begin- und End-Block sieht es so aus:
Delphi-Quellcode:
if...then
begin
  Anweisung1;
  Anweisung2;
end
else
begin
  Anweisung3;
  Anweisung4;
end
und nicht so:
Delphi-Quellcode:
if...then
begin
  Anweisung1;
  Anweisung2;
end
  else
begin
  Anweisung3;
  Anweisung4;
end;
oder so:
Delphi-Quellcode:
if...then
  begin
    Anweisung1;
    Anweisung2;
  end
else
  begin
    Anweisung3;
    Anweisung4;
  end;
Selbst bei Else-If bleibt alles gleich eingerückt:
Delphi-Quellcode:
if...then
begin
  Anweisung1;
  Anweisung2;
end
else if... then
begin
  Anweisung3;
  Anweisung4;
end;
Else wird niemals eingerückt, weil es Teil er gleichen Anweisung ist. Wer es anders macht, macht es weil er es für schöner hält, nicht weil es richtig ist.

Popov 1. Apr 2015 17:04

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

Zitat von Neutral General (Beitrag 1295843)
Naja ganz einfach: In der Delphi Doku sieht es so aus als würde das else zum except gehören...

Tut es auch:
Delphi-Quellcode:
begin
   try
      WriteLn( 'Hallo Welt'.ToInteger() );
   except
     // eine Folge von Exception-Behandlungsroutinen, optional mit nachfolgendem else
     on EConvertError do
       WriteLn('Ein zahlenloser Tag');
   else
     WriteLn('Das Programm ist fehlerhaft. Tauschen sie es um.');
   end;
end.

mjustin 1. Apr 2015 17:04

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

Zitat von Popov (Beitrag 1295844)
Zitat:

Zitat von mjustin (Beitrag 1295827)
aber im Docwiki wird bei case und except jeweils das else in gleicher Weise eingerückt, das kann kein Zufall sein :)

Else wird niemals eingerückt

Mit "in der gleichen Weise" wollte ich sagen, dass else konsistent - bei case, und bei except - in gleicher Weise nicht eingerückt wird. Also so wie in den richtigen Beispielen deines Beitrags.

Popov 1. Apr 2015 17:06

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

mjustin 1. Apr 2015 17:13

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

Zitat von Popov (Beitrag 1295846)
Zitat:

Zitat von Neutral General (Beitrag 1295843)
Naja ganz einfach: In der Delphi Doku sieht es so aus als würde das else zum except gehören...

Tut es auch:
Delphi-Quellcode:
begin
   try
      WriteLn( 'Hallo Welt'.ToInteger() );
   except
     // eine Folge von Exception-Behandlungsroutinen, optional mit nachfolgendem else
     on EConvertError do
       WriteLn('Ein zahlenloser Tag');
   else
     WriteLn('Das Programm ist fehlerhaft. Tauschen sie es um.');
   end;
end.

Mein Bauchgefühl sagt mir, dass das else hier eingerückt sein sollte. Wird es so wie hier auf die gleiche Ebene wie das except gesetzt, wirkt es, aus als ob nach ihm der Codezweig für den Fall "keine Exception aufgetreten" beginnt. Aber zum Glück gibt es Style Guides :)

Popov 1. Apr 2015 17:22

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Natürlich wird Else bei Try-Except nur dann eingesetzt wenn auch On..Do eingesetzt wird. Trotzdem bildet es mit Try und Except die Einrückung. Es heißt ja auch nicht:
Delphi-Quellcode:
   try
      WriteLn( 'Hallo Welt'.ToInteger() );
   except
     // eine Folge von Exception-Behandlungsroutinen, optional mit nachfolgendem else
     on EConvertError do
       WriteLn('Ein zahlenloser Tag')
     else
       WriteLn('Das Programm ist fehlerhaft. Tauschen sie es um.');
   end;
In dem Fall gäbe es vor Else kein Semikolon.

On ist keine Abfrage, braucht also auch keine Alternative. Else kommt nur ins Spiel wenn kein keine der Exceptions gegriffen hat.

BadenPower 1. Apr 2015 17:26

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

Zitat von Popov (Beitrag 1295846)
Zitat:

Zitat von Neutral General (Beitrag 1295843)
Naja ganz einfach: In der Delphi Doku sieht es so aus als würde das else zum except gehören...

Tut es auch:

Ne, tut es nicht.

Das ELSE ist dem EXCEPT untergeordnet, denn es wird ja NICHT aufgerufen, wenn keine Exception stattfindet, sondern nur wenn wir uns bereits im Exception-Block befinden und im Exception-Block keine der On-Bedingungen zutrifft.

Also gehört das ELSE zu den On-Bedingungen und müsste daher eingerückt sein.

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:

mjustin 2. Apr 2015 07:08

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

Zitat von Popov (Beitrag 1295877)
Delphi Hilfe meint es:
...
Wikibook.org meint es:
...
Delphi-Tref meint es

Die Delphi Hilfe gefällt mir hier am besten, denn sie deutet an ("HandleAllOthers"), dass der else Zweig für alle anderen Exceptions zuständig ist.

Wikibook.org und Delphitreff haben die Beispiel so reduziert, dass dieses Detail fehlt und man leicht annehmen könnte, das else gälte für den Fall dass keine Exception auftritt. Wenn man die Beispiele in Art Pseudocode übersetzen würde, und auf die Einrückung verzichtet, entspricht es:

Code:
Versuche <...> BeiAusnahmen <...> Sonst <...> Ende
Bei case Anweisungen ist das else etwas weniger missverständlich:

Code:
Falls <...> Sonst <...> Ende

Uwe Raabe 2. Apr 2015 07:36

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

Zitat von Popov (Beitrag 1295863)
Wenn Else zu On gehört, dann müsste es dem Except-Block egal sein ob es vorher noch ein Hallo sagt.

Genau. Wenn else zu on gehören würde, dann müsste man für jedes on ein eigenes else schreiben können. Insbesondere darf aber nach einem else kein on mehr kommen.

Es ist ja auch so, daß für das else kein begin-end für mehrere Anweisungen im else-Block notwendig ist, sondern das end des try-except-end das else abschließt.

Zitat:

Zitat von himitsu (Beitrag 1295859)
PS: ELSE gibt es dort nur, wenn vorher ein ON steht.

Nicht zwingend! Auch das hier compiliert (unter XE7) und ist faktisch identisch mit dem ohne die else-Zeile:

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

    a := 5;
    Writeln(IntToStr(10 div (a-5)));
  except
  else
    Writeln('WTF');
    Writeln('Else');
  end;
end;
Die Frage des Einrückens bleibt aber trotzdem immer noch Geschmackssache.

Der schöne Günther 2. Apr 2015 08:38

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Und ich dachte immer der Glaubenskrieg zwischen Leerzeichen- und Tab-Verfechtern sei der schlimmste :-D

Uwe Raabe 2. Apr 2015 08:44

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

Zitat von Der schöne Günther (Beitrag 1295920)
Und ich dachte immer der Glaubenskrieg zwischen Leerzeichen- und Tab-Verfechtern sei der schlimmste :-D

:) Glaubenskrieg ist die Frage der Einrückung. Was der Compiler akzeptiert und daraus macht hat mit Glauben nichts zu tun.

Sherlock 2. Apr 2015 09:20

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Ich komme mal auf die Ausgangsfrage zurück und beantworte knapp und praktisch (probieren geht ja bekanntlich über studieren): Wenn es kompiliert.
Komm ich jetzt im Fernsehen?
:stupid:
Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 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