Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Inline Variablen-Deklaration bei try..except (https://www.delphipraxis.net/179956-inline-variablen-deklaration-bei-try-except.html)

Der schöne Günther 14. Apr 2014 09:20

Delphi-Version: XE5

Inline Variablen-Deklaration bei try..except
 
Als ich das erste mal Delphis eigenen
Delphi-Quellcode:
var
-Block für lokale Variablen sah musste ich sofort an die alten C-Compiler denken die erst säuberlich ihre Variablen deklariert und dann die Anweisungen haben wollten.

Mittlerweile kann ich sagen, dass das "Fehlen" von inline Deklarationen eins der Dinge ist, die ich in anderen Sprachen am meisten vermisse. :thumb:

Darum soll es aber nicht gehen: Was hat es eigentlich mit
Delphi-Quellcode:
var
   // Nichts
begin

   try
      // Zeug
   except
      on e: EFileNotFoundException do
         e.Zeugs();
   else
      raise;
   end;
   
end;
auf sich? Natürlich ist es jetzt schön handy, sich hier in einem Abwasch die Variable
Delphi-Quellcode:
e
zu deklarieren und damit direkt weiterzuarbeiten. Im Gegensatz kann ich noch nicht einmal im
Delphi-Quellcode:
var
-Block meine Exception-Variable aufführen.

Syntaktisch gesehen eigentlich doch ein Sakrileg, oder?

himitsu 14. Apr 2014 11:44

AW: Inline Variablen-Deklaration bei try..except
 
Ja, ein bissl komisch ist das schon, aber im Prinzip ist das hier nur ein "lokaler" gecasteter Alias für Delphi-Referenz durchsuchenSystem.ExceptObject (aktuelles Exception-Objekt).

Stell es dir als eine Art Makro vor, welches intern die Variablen anlegt, vergleicht und castet.

Delphi-Quellcode:
begin
  try
    // böses Zeug
  except
    on E: EFileNotFoundException do
      E.Kaputt;
    on E: EProgrammerNotFound do
      E.FaulerSack;
    else
      raise;
  end;
end;
Delphi-Quellcode:
begin
  try
    // böses Zeug
  except
    if ExceptObject is EFileNotFoundException then
      EFileNotFoundException(ExceptObject).Kaputt
    else if ExceptObject is EProgrammerNotFound then
      EProgrammerNotFound(ExceptObject).FaulerSack
    else
      raise;
  end;
end;
Delphi-Quellcode:
var
  E: EFileNotFoundException;
  E2: EProgrammerNotFound;
begin
  try
    // böses Zeug
  except
    if ExceptObject is EFileNotFoundException then begin
      E := EFileNotFoundException(ExceptObject);
      E.Kaputt;
    end else if ExceptObject is EProgrammerNotFound then begin
      E2 := EProgrammerNotFound(ExceptObject);
      E2.FaulerSack;
    end else
      raise;
  end;
end;
Delphi legt ja auch so öfters mal "unsichtbare" lokale Variablen an,
sei es bei
Delphi-Quellcode:
a := b + c * d
, wo das Ergebnis von c*d ja quasi in einer Zwischenvariable landet,
oder der Enumerator einer For-In-Schleife und vorallem beim
Delphi-Quellcode:
with
. :stupid:

Dejan Vu 14. Apr 2014 12:48

AW: Inline Variablen-Deklaration bei try..except
 
Die Exception-Variable hat außerhalb des spezifischen Catch/Except-Blocks keine Gültigkeit, d.h. der Zugriff bzw. der Inhalt ist undefiniert. Per Definitionem nicht. Man könnte sie auf Nil setzen, aber selbst dann ist nicht klar, was damit gemeint ist.

Zitat:

Zitat von Der schöne Günther (Beitrag 1255538)
Mittlerweile kann ich sagen, dass das "Fehlen" von inline Deklarationen eins der Dinge ist, die ich in anderen Sprachen am meisten vermisse. :thumb:

Verstehe ich nicht. Oder meinst Du mit 'inline Deklarationen' das 'var'? Das kannst Du doch mit C#, Jave usw. genauso machen. Sollst Du zwar nicht, weil es nicht hübsch ist, aber Du kannst.

Mikkey 14. Apr 2014 13:38

AW: Inline Variablen-Deklaration bei try..except
 
Zitat:

Zitat von Dejan Vu (Beitrag 1255571)
Zitat:

Zitat von Der schöne Günther (Beitrag 1255538)
Mittlerweile kann ich sagen, dass das "Fehlen" von inline Deklarationen eins der Dinge ist, die ich in anderen Sprachen am meisten vermisse. :thumb:

Verstehe ich nicht.

Soll heißen^^^^^^^^^^Heißt: das "Fehlen" ... vermisse ich am meisten.

Ansonsten

Zitat:

Zitat von Dejan Vu (Beitrag 1255571)
Sollst Du zwar nicht, weil es nicht hübsch ist, aber Du kannst

Ich C# ist es absolut so vorgesehen, dass der Scope jeder lokalen Variablen so klein sein soll, wie nur irgend möglich.

Z.B. Schleifenzähler sollen immer so verwendet werden:

Code:
for (int i = 1;...; i++)
So ist i tatsächlich nur innerhalb der Schleife bekannt.

mkinzler 14. Apr 2014 13:39

AW: Inline Variablen-Deklaration bei try..except
 
Ist uach bei C, C++ und m.W. Java so.

Dejan Vu 14. Apr 2014 14:13

AW: Inline Variablen-Deklaration bei try..except
 
Zitat:

Zitat von Mikkey (Beitrag 1255581)
Ich C# ist es absolut so vorgesehen, dass der Scope jeder lokalen Variablen so klein sein soll, wie nur irgend möglich.

Deswegen schrieb ich ja
Zitat:

Zitat von Dejan Vu (Beitrag 1255571)
Sollst Du zwar nicht, weil es nicht hübsch ist, aber Du kannst..

Aber bei for-Schleifenvariablen hast Du recht, da geht das nicht anders. Ansonsten kannst Du ja eine Variable am Anfang der Methode deklarieren, und erst 3000 Zeilen später verwenden. Du wirst zwar geteert und gefedert, aber wenn Du darauf stehst, ist es eine gute Möglichkeit, für lau seiner Obsession zu fröhnen.


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