Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi try ... except --> wann verwenden ??? (https://www.delphipraxis.net/96891-try-except-wann-verwenden.html)

Christian18 1. Aug 2007 11:16


try ... except --> wann verwenden ???
 
Hallo,

ich habe ein kleines Projekt, wo ich alle Fehler mit try ... except abfangen möchte. Nun stellt sich mir die Frage wann man es verwenden.

Wenn man nur ein Label beschriftet, dann soch sicherlich nicht oder? Wann verwendet Ihr try ... except???

MFG Chris

Matze 1. Aug 2007 11:22

Re: try ... except --> wann verwenden ???
 
Hallo,

ich würde es da nutzen, wo Fehleingaben vom Benutzer Fehler verursachen würden bzw. allgemein da, wo Fehler leicht auftreten können. Wenn möglich solltest du jedoch try-except weitmöglich umgehen und lieber per if-Abfragen prüfen, ob etwas funktioniert hat oder nicht, finde ich. Das ist je nach Situation natürlich unterschiedlich.
Alle Fehler abzufangen wäre ganz simpel mittels TApplicatioEvents (oder wie das genau heißt) möglich, doch Fehler nur zu unterdrücken ist nicht ratsam.

Luckie 1. Aug 2007 11:25

Re: try ... except --> wann verwenden ???
 
Da gibt es einen guten Artikel: Exception Handling for Fun and Profit.

Christian18 1. Aug 2007 11:45

Re: try ... except --> wann verwenden ???
 
danke,

ihr habt mir sehr geholfen. Besonders luckie xD

Dezipaitor 1. Aug 2007 12:01

Re: try ... except --> wann verwenden ???
 
Delphi-Quellcode:
try
 XY;
except
end;
Für solche Fälle musste ich feststellen, dass diese Art von Exceptionhandling Speicherlöcher erzeugen kann.

SirThornberry 1. Aug 2007 12:27

Re: try ... except --> wann verwenden ???
 
Zitat:

Zitat von Dezipaitor
Delphi-Quellcode:
try
 XY;
except
end;
Für solche Fälle musste ich feststellen, dass diese Art von Exceptionhandling Speicherlöcher erzeugen kann.

Das hängt davon ab was XY ist. Und wenn da ein Speicherloch entsteht liegt es daran das nach dem exceptblock wohl etwas vorher reserviertes nicht frei gegeben wird.

ptown67 1. Aug 2007 12:31

Re: try ... except --> wann verwenden ???
 
Hier ein gutes Beispiel:

Code:
uses
  URLMon;

procedure TForm1.Button1Click(Sender: TObject);
var
  Datei,Ziel:PChar;
begin
  Label1.Caption := 'Download gestartet';
  try
    Datei := 'http://www.DieSeite/DieDatei.zip';
    Ziel := 'C:\Windows\Desktop\DieDatei.zip';
    UrlDownloadToFile(nil, Datei, Ziel, 0, nil);
    Label1.Caption := 'Download beendet';
  except
    showmessage('Download abgebrochen');
  end;
end;
Gruß Freeman

Luckie 1. Aug 2007 12:33

Re: try ... except --> wann verwenden ???
 
Gerade das ist ein schlechtes Beispiel, weil API-Funktionen in der Regel keine Exceptions werfen. Zu dem hat UrlDownloadToFile einen Rückgabewert, den man auswerten kann.

Dezipaitor 1. Aug 2007 12:51

Re: try ... except --> wann verwenden ???
 
So ich hab mal ein Beispiel für Exception (ob gut oder schlecht?)

Delphi-Quellcode:

 {@Name function generates an audit message in the security event log.
         For a detailed information see MSDN : [url]http://msdn2.microsoft.com/en-gb/library/aa379305.aspx[/url]

         If you want to enable audit functions the calling process (not thread token!) needs the SeAuditPrivilege privilege.
         Per default only services have this privilege. However it can be enabled in group policy editor : "gpedit.msc" manager (under xp)
           Computer configuration -> Windows settings -> security settings -> local policies -> audit policy
            enable (success/failure) policy : audit privilege
          The parameter AccessGranted is linked with the type of policy - success or failiure.
          ([url]http://www.nemesisblue.info/images%5Cgpedit1.gif[/url])

         The audit event can be seen in the event viewer in security leaf.

         @param(ClientToken is the token to be used in audit log. )

         @raises(ESMPrivilegeNotFoundException will be raised if the process token does not have the privilege : SE_AUDIT_NAME)
         @raises(ESMWinCallFailedException will be raised if the winapi call to PrivilegedServiceAuditAlarm failed.)
         @raises(ESMInvalidTokenHandle will be raised if the parameter ClientToken is nil)
         }
class procedure TSecurityToken.PrivilegedServiceAuditAlarm(SubsystemName, ServiceName : TString; ClientToken : TSecurityToken;
                                        Privileges : TPrivilegeSet; AccessGranted :Boolean);


var pPriv : JwaWinNT.PPRIVILEGE_SET;
    privs : TPrivilegeSet;

    primToken : TSecurityToken;
    bOldAuditPriv : Boolean;
begin
  if not Assigned(ClientToken) then
    raise ESMInvalidTokenHandle.CreateFmtEx('ClientToken must not be nil.', 'PrivilegedServiceAuditAlarm',ClassName,'USM_Token.pas', 0,true,[]);


  {PrivilegedServiceAuditAlarm checks the process token for the needed privilege SE_AUDIT_NAME.
   So we open it here.
   The thread that calls this function does not need that privilege.

   We open the token with minimal access.

  }
  primToken := TSecurityToken.CreateTokenByProcess(0,
                TOKEN_READ or
                TOKEN_QUERY or
                TOKEN_ADJUST_PRIVILEGES or
                TOKEN_AUDIT_SUCCESS_INCLUDE or TOKEN_AUDIT_SUCCESS_EXCLUDE or
                TOKEN_AUDIT_FAILURE_INCLUDE or TOKEN_AUDIT_FAILURE_EXCLUDE);

  {first we try to get status of SE_AUDIT_NAME privilege.
   Maybe the process has not the privilege?

   We save the privilege status for later resetting.
  }
  try
    bOldAuditPriv := primToken.PrivilegeEnabled[SE_AUDIT_NAME];
  except
    on E1 : ESMPrivilegeNotFoundException do
    begin
      //do special things here - for future
      primToken.Free;
      raise; //notify caller
    end;

    On E2 : Exception do
    begin
      //free in every case
      primToken.Free;
      raise; //but re-raise
    end;
  end;

  //not enable privilege
  primToken.PrivilegeEnabled[SE_AUDIT_NAME] := true;

  //now we set all privileges of the client token, so they will be shown in the audit log message
  privs := ClientToken.GetTokenPrivileges;
  pPriv := privs.Create_PPRIVILEGE_SET;

  if not {$IFDEF SM_UNICODE}PrivilegedServiceAuditAlarmW{$ELSE}PrivilegedServiceAuditAlarmA{$ENDIF}
        (TPChar(SubsystemName), TPChar(ServiceName), ClientToken.TokenHandle,pPriv^, AccessGranted)  then
  begin
    //reset privilege to old status
    //free everything before raise exception
    primToken.PrivilegeEnabled[SE_AUDIT_NAME] := bOldAuditPriv;
    privs.Free_PPRIVILEGE_SET(pPriv);
    privs.Free;
    //free token
    primToken.Free;
    raise ESMWinCallFailedException.CreateFmtEx('Call to PrivilegeCheck failed.', 'PrivilegedServiceAuditAlarm',ClassName,'USM_Token.pas', 0,true,[]);
  end;

  //reset privilege to old status
  primToken.PrivilegeEnabled[SE_AUDIT_NAME] := bOldAuditPriv;
  privs.Free_PPRIVILEGE_SET(pPriv);
  privs.Free;
  //free token
  primToken.Free;
end;

Luckie 1. Aug 2007 12:55

Re: try ... except --> wann verwenden ???
 
Dein primToken wird im Falle eines Fehlers in der Methode nicht freigegeben. Da gehört noch ein try-finally-Block drumrum.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:13 Uhr.
Seite 1 von 3  1 23      

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