AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
Thema durchsuchen
Ansicht
Themen-Optionen

[Quiz] wann darf auf ein Semikolon ein ELSE folgen?

Ein Thema von mjustin · begonnen am 1. Apr 2015 · letzter Beitrag vom 2. Apr 2015
Antwort Antwort
Seite 1 von 2  1 2      
Popov
(Gast)

n/a Beiträge
 
#1

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

  Alt 1. Apr 2015, 18:04
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.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.008 Beiträge
 
Delphi 2009 Professional
 
#2

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

  Alt 1. Apr 2015, 18:13
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
Michael Justin
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

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

  Alt 1. Apr 2015, 18:22
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.
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#4

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

  Alt 1. Apr 2015, 18:26
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.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#5

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

  Alt 1. Apr 2015, 18:45
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.
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#6

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

  Alt 1. Apr 2015, 19:18
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;
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

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

  Alt 1. Apr 2015, 19:30
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.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

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

  Alt 1. Apr 2015, 20:04
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#9

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

  Alt 1. Apr 2015, 20:11
Wie kann man denn ernsthaft der Meinung sein, dass das else auf die gleiche Stufe wie das except gehört? 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.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#10

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

  Alt 1. Apr 2015, 20:37
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 try..except..end; und 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.
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?
Wie kann man denn ernsthaft der Meinung sein, dass das else auf die gleiche Stufe wie das except gehört?
Delphi Hilfe meint es:
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 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 von delphi-treff.de:
Delphi-Quellcode:
except
  on EZeroDivide do ...;
  on EMathError do ...;
  on EMyError do ...;
else
  ...;
end;
Popov meint es.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:52 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 by Thomas Breitkreuz