Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Try Finally End verlassen bzw. abbrechen (https://www.delphipraxis.net/180570-try-finally-end-verlassen-bzw-abbrechen.html)

stahli 30. Mai 2014 14:28

AW: Try Finally End verlassen bzw. abbrechen
 
Ich habe das missverständlich formuliert.
Verbale Rückmeldung und Ruhen lassen des Threads reicht aus. Ein Erledigt-Flag oder Abschließen des Threads ist nicht notwending.

himitsu 30. Mai 2014 14:35

AW: Try Finally End verlassen bzw. abbrechen
 
Ein Manifest welches ensprechende (Admin)Rechte anfordert,
oder ein externer Aufruf z.B. über Runas, oder über Eigenschaften von Verknüpfungen (lnk), oder der zugeordnete Benutzerkonto eines Services usw.


Wenn man das unbedingt markieren will, dann kann man beim Erstellen einer Frage diese als "offen" markieren und das später wieder weg machen,
oder schreibt einfach, daß und eventuell welche Lösung man genommen hat.

Dejan Vu 31. Mai 2014 08:27

AW: Try Finally End verlassen bzw. abbrechen
 
Ich würde das so lösen:
Delphi-Quellcode:
Procedure TForm1.BtnStartClick(Sender: TObject);
Const
   DummySpace  ='C:\$space';

   Procedure _DemandDirectoryCreated(string aDirectory);
   Begin
      CreateDir(aDirectory);
      if Not DirectoryExists(aDirectory) Then
         Abort;
   end;

Begin
   BtnStart.Enabled:=False;
   MELog.Lines.Clear;
   Try
      MELog.Lines.Append('Step 1: Allocating Memory');
      MELog.Lines.Append('- creating directory "' + DummySpace + '"');

      _DemandDirectoryCreated(DummySpace);
     
     MELog.Lines.Append(' success...');
      // Hier nur weiter, wenn Verzeichnis angelegt wurde/existiert

   Except
      MELog.Lines.Append(' Could not create "' + DummySpace + '".');
      MELog.Lines.Append(' Error was: "' + SysErrorMessage(GetLastError) + '"');
      MELog.Lines.Append(' Opreation aborted.');
   End;
   BtnStart.Enabled:=True;
End;

Sir Rufo 31. Mai 2014 08:35

AW: Try Finally End verlassen bzw. abbrechen
 
@Dejan Vu

Das kann evtl. funktionieren, allerdings muss der Aufruf von
Delphi-Quellcode:
GetLastError
direkt im Anschluss der Funktion aufgerufen werden, wo dieser Fehler (hier
Delphi-Quellcode:
CreateDir
) aufgetreten ist.

Ansonsten ist nicht gewährleistet, dass man auch wirklich die Fehlermeldung bekommt, die man eigentlich haben möchte.

EDIT
Eigentlich arbeitet
Delphi-Quellcode:
GetLastError
nur dann zuverlässig, wenn man gesichert direkt vorher eine Windows-Funktion aufgerufen hat.

Bei Delphi-Referenz durchsuchenSysUtils.CreateDir kann man sich da aber nicht wirklich sicher sein ...

Delphi-Quellcode:
type
  // Wenn ein Arbeitsschritt fehlschlägt, dann diese Exception werfen
  EStepException = class(Exception);

procedure TForm1.BtnStartClick( Sender : TObject );
begin
  BtnStart.Enabled := False;
  try
    try

      MELog.Lines.Append('Step 1: Allocating Memory');
      MELog.Lines.Append('- creating directory "' + DummySpace + '"');

      if ForceDirectories( DummySpace )
      then
        MELog.Lines.Append( ' success' )
      else
        raise EStepException.CreateFmt( 'Could not create "%s"', [DummySpace] );

      // nächste Schritte

    except
      on E: EStepException do
        begin
          MELog.Lines.Append( E.Message );
          MELog.Lines.Append( 'Operation aborted.' );
          raise;
        end;
    end;
  finally
    BtnStart.Enabled := True;
  end;
end;

Dejan Vu 31. Mai 2014 10:45

AW: Try Finally End verlassen bzw. abbrechen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1260849)
...allerdings muss der Aufruf von
Delphi-Quellcode:
GetLastError
direkt im Anschluss der Funktion aufgerufen werden, wo dieser Fehler (hier
Delphi-Quellcode:
CreateDir
) aufgetreten ist.

Korrekt. War mir da auch nicht sicher. Mir ging es primär um den Kontrollfluss (exceptions, statt IF-Schl... Verzweigungen). Aber wenn man Code postet, sollte der schon 100% richtig sein. Und 'ForceDirectories' hatte ich nicht mehr auf dem Schirm.

Leider ist Delphi da noch nicht konsequent und bietet durchweg Methoden an, die knallen, anstatt einen Rückgabewert zu liefern. Dann dadurch wird man ja gerade dazu verleitet, IF-THEN-Verschachtelngsorgien zu 'feiern'.

Gehört hier aber nicht hin.

himitsu 31. Mai 2014 13:06

AW: Try Finally End verlassen bzw. abbrechen
 
Exceptions sind nicht zur standardmäßigen Flusssteuerung vorgesehen und vorallem beim Debuggen fällt man mit soeinem Schrott einfach nur voll auf die Fresse.

Wobei hier das ja auch als Ausnahme gesehen werden kann, wenn man auf das Verzeichnis nicht zugreifen kann und demnach nachfolgene Operationen, welche ja die Hauptfunktionalität darstellen, nicht mehr ausführbar sind.

Dejan Vu 31. Mai 2014 13:53

AW: Try Finally End verlassen bzw. abbrechen
 
Zitat:

Zitat von himitsu (Beitrag 1260880)
Exceptions sind nicht zur standardmäßigen Flusssteuerung vorgesehen

Doch. In der modernen Softwarearchitektur schon.

Edit: 'standardmäßigen' ist das Zauberwort. Da hast Du recht. Aber es war ein ungünstiger Kommentar zu einem imho legitimen Einsatz von Exceptions.

Ich bezeichne das als happy path programming. Der Kontrollfluß zeigt, wie es im Normalfall (der happy path) aussieht und die Ausnahmen hüpfen einfach raus (bzw. in den Except/Finally Teil).

mkinzler 31. Mai 2014 13:54

AW: Try Finally End verlassen bzw. abbrechen
 
Zitat:

Zitat von Dejan Vu (Beitrag 1260887)
Zitat:

Zitat von himitsu (Beitrag 1260880)
Exceptions sind nicht zur standardmäßigen Flusssteuerung vorgesehen

Doch. In der modernen Softwarearchitektur schon.

Also fahren nach Gehör!

BUG 31. Mai 2014 14:12

AW: Try Finally End verlassen bzw. abbrechen
 
Der Fall, das ein Verzeichnis nicht angelegt werden kann und nicht existiert, ist meiner Meinung nach eine ziemliche Ausnahme (abgesehen von merkwürdigen Ordner-Namen oder nicht existierenden Eltern-Ordnern, die sollte man vielleicht vorher abfangen).
Außerdem wird die Operation abgebrochen und ein Log-Eintrag dazu angelegt.

Was muss noch alles dazu kommen, das eine Exception gerechtfertigt ist? Random Memory Corruption? :mrgreen:

Dejan Vu 31. Mai 2014 16:58

AW: Try Finally End verlassen bzw. abbrechen
 
Zitat:

Zitat von mkinzler (Beitrag 1260888)
Zitat:

Zitat von Dejan Vu (Beitrag 1260887)
Doch. In der modernen Softwarearchitektur schon.

Also fahren nach Gehör!

Eher übersichtlichen Code produzieren!

Zitat:

Zitat von BUG (Beitrag 1260890)
Der Fall, das ein Verzeichnis nicht angelegt werden kann und nicht existiert...

Hat mich auch gewundert. Aber wenn Du das Verzeichnis anlegst und dann wird die Festplatte ausgetauscht?.... :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 Uhr.
Seite 2 von 2     12   

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