![]() |
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:
Normalerweise ist else nach einem Semikolon nicht möglich und führt zu einer Fehlermeldung beim Kompilieren.
<Statement>;
else (...) 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? |
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Bei else vom CASE-Konstrukt ( hiess ursprünglich auch OTHERWISE)
|
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 |
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?
|
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. |
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zitat:
Delphi-Quellcode:
Dagegen würde ich diese Einrückung bevorzugen:
try
... except on EZeroDivide do HandleZeroDivide; on EOverflow do HandleOverflow; on EMathError do HandleMathError; else HandleAllOthers; end;
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. ![]() Zitat:
|
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Gab es nicht noch irgendeinen Fall mit Verschachtelung? :gruebel:
Delphi-Quellcode:
Das scheint es aber nicht zu sein... zumindest nicht unter FreePascal.
if a then
if b then foo; else bar; |
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zitat:
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. |
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zitat:
Somit gibt es vor diesen Else kein Semikolon:
Delphi-Quellcode:
denn auch wenn hier kein
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;
Delphi-Quellcode:
Block zwischen
begin..end
Delphi-Quellcode:
und
case..of
Delphi-Quellcode:
steht,
else
Delphi-Quellcode:
und
case..of
Delphi-Quellcode:
sind ein Block.
else
Delphi-Quellcode:
wird mit einem
case..of
Delphi-Quellcode:
abgeschlossen, nicht mit einem Semikolon wie bei einer If-Abfrage. Also, entweder bilden
end;
Delphi-Quellcode:
und
case..of
Delphi-Quellcode:
einen Block oder
else
Delphi-Quellcode:
und
case..of
Delphi-Quellcode:
. Womit es egal ist ob hier vor
end;
Delphi-Quellcode:
ein Semokolon steht, denn das hat keinen Einfluß auf
else
Delphi-Quellcode:
. Denn das Semikolon ist in einem Block eingeschlossen.
else
Wo gibt es Blocks?
Delphi-Quellcode:
Bei
begin..end;
repeat..until while..end; try..except..else..end; case..of..else..end; usw.
Delphi-Quellcode:
bilden
case..of..else
Delphi-Quellcode:
und
case..of
Delphi-Quellcode:
einen Block, genau wie
else
Delphi-Quellcode:
und
begin
Delphi-Quellcode:
. Das Gleiche gilt für
end
Delphi-Quellcode:
. Somit sind das keine Ausnahmen, denn
try..except..else
Delphi-Quellcode:
bilden einen Block wie
except..else
Delphi-Quellcode:
.
begin..end
Bei
Delphi-Quellcode:
ist das anders.
if..then..else
Delphi-Quellcode:
bilden keinen Block. Pascal geht somit davon aus, dass wenn zwischen
if..then else
Delphi-Quellcode:
und
then
Delphi-Quellcode:
kein
else
Delphi-Quellcode:
Block steht, es sich um eine einzelne Anweisung handelt. Und da man
begin..end
Delphi-Quellcode:
mit und ohne
if..then
Delphi-Quellcode:
ausführen kann, sagt das Semikolon, dass hier die Abfrage zu ende ist. Wenn dann in der nächsten Zeile ein
else
Delphi-Quellcode:
auftaucht, dann ist es eine undefinierte Anweisung.
else
|
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zitat:
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? |
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zitat:
Zitat:
<promotion>Ich vergebe gerne eine kostenlose Single Developer Lizenz mit Sourcecode meines Web Frameworks ( ![]() |
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. |
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zitat:
|
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zitat:
Delphi-Quellcode:
Anweisung handelt. Else ist keine Unteranweisung, womit das mit Else so aussieht:
if...then...else
Delphi-Quellcode:
Es sieht niemals so aus:
if...then
Anweisung1 else Anweisung2;
Delphi-Quellcode:
oder so:
if...then
Anweisung1 else Anweisung2;
Delphi-Quellcode:
Mit Begin- und End-Block sieht es so aus:
if...then
Anweisung1 else Anweisung2;
Delphi-Quellcode:
und nicht so:
if...then
begin Anweisung1; Anweisung2; end else begin Anweisung3; Anweisung4; end
Delphi-Quellcode:
oder so:
if...then
begin Anweisung1; Anweisung2; end else begin Anweisung3; Anweisung4; end;
Delphi-Quellcode:
Selbst bei Else-If bleibt alles gleich eingerückt:
if...then
begin Anweisung1; Anweisung2; end else begin Anweisung3; Anweisung4; end;
Delphi-Quellcode:
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.
if...then
begin Anweisung1; Anweisung2; end else if... then begin Anweisung3; Anweisung4; end; |
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zitat:
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. |
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zitat:
|
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Ok.
|
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zitat:
|
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:
In dem Fall gäbe es vor Else kein Semikolon.
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; On ist keine Abfrage, braucht also auch keine Alternative. Else kommt nur ins Spiel wenn kein keine der Exceptions gegriffen hat. |
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zitat:
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. |
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zu welcher dieser On-Bedingungen würde das Else gehören? Beispiel aus:
![]()
Delphi-Quellcode:
Hier ein anderes Beispiel:
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.
Delphi-Quellcode:
Division durch Null wird im Except-Block ausgeführt. Fallen sonstige Fehler an, werden die in Else abgearbeitet.
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; Ü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:
Geht nicht. Wird gar nicht erst kompiliert.
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; |
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:
einem
on e: irgendwas do begin ... end
Delphi-Quellcode:
entspricht, kann man das auch selber machen.
if ExceptObject is irgendwas then begin var E := ExceptObject as irgendwas; ... end;
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. |
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zitat:
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; |
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:
Wie kann also nach dem Ende noch etwas folgen?
on E:EDivByZero do
ShowMessage('Division durch Null.'); Außerdem, wieso funktioniert das nicht?
Delphi-Quellcode:
Wenn Else zu On gehört, dann müsste es dem Except-Block egal sein ob es vorher noch ein Hallo sagt.
try
... except ShowMessage('Hallo.'); on E:EDivByZero do ShowMessage('Division durch Null.'); else ShowMessage('Sonstige Fehler.'); end; |
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zitat:
|
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: |
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Wie kann man denn ernsthaft der Meinung sein, dass das
Delphi-Quellcode:
auf die gleiche Stufe wie das
else
Delphi-Quellcode:
gehört? :shock: Das ist für mich völlig absurd. Oder ist das ein Aprilscherz?
except
Auf jeden Fall kann man da bestimmt einen wunderbaren Flamewar drüber entfachen. |
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zitat:
|
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zitat:
Delphi-Quellcode:
und
try..except..end;
Delphi-Quellcode:
nicht das Gleiche sind und beim Zweiten nur Ons im Except-Block akzeptiert werden?
try..except..else..end;
Auf der anderen Seite - ich denke so wichtig ist das nun auch wieder nicht. Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
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:
|
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zitat:
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:
Bei case Anweisungen ist das else etwas weniger missverständlich:
Versuche <...> BeiAusnahmen <...> Sonst <...> Ende
Code:
Falls <...> Sonst <...> Ende
|
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zitat:
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:
Delphi-Quellcode:
Die Frage des Einrückens bleibt aber trotzdem immer noch Geschmackssache.
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; |
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
|
AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Zitat:
|
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 11:00 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