![]() |
Design Problem: Exceptions in einer Schleife
Ich habe eine Routine:
Delphi-Quellcode:
Diese wirft im Fehlerfall eine Exception. Schön und gut, das tut sie auch. Nur leider wird diese Funktion in einer Schleife aufgerufen und wenn die Exception geworfen wird, fliege ich ganz aus der Schleife raus:
function TProcess.SetPriorityClass: DWORD;
var hProcess: THandle; begin Result := 0; hProcess := OpenProcess(PROCESS_QUERY_INFORMATION, False, FProcID); if hProcess <> 0 then begin Result := Windows.GetPriorityClass(hProcess); CloseHandle(hProcess); end else raise TMpuProcToolException.Create(SysErrorMessage(GetLastError), GetLastError); end;
Delphi-Quellcode:
Die Schleife steckt in der Methode ProcList.EnumProcesses:
ProcList := TProcessList.Create(False);
try try ProcList.EnableDebugPrivileges; ProcList.EnumProcesses; for i := 0 to ProcList.Count - 1 do begin s := ExtractFilename(ProcList.Items[i].ModuleFilename) + #9; s := s + Format('0x%.8X', [ProcList.Items[i].ProcessPriority]); Writeln(IntToStr(ProcList.Items[i].ProcID) + #9 + s); end; except on E: TMpuProcToolException do Writeln(E.Message); end; finally ProcList.Free; end;
Delphi-Quellcode:
Und das ist natürlich blöd, dass ich bei der Exceptions aus der Schleife fliege.
procedure TProcessList.EnumProcesses;
var PIDList : array[0..1024] of DWORD; Needed : DWORD; i : Integer; Process : TProcess; begin if Psapi.EnumProcesses(@PIDList, sizeof(PIDList), Needed) then begin for i := 0 to Needed div sizeof(DWORD) - 1 do begin Process := TProcess.Create(PIDList[i]); FProcessList.Add(Process); end; end else raise TMpuProcToolException.Create(SysErrorMessage(GetLastError), GetLastError); end; Was kann man da am Design machen, dass ich nicht aus der Schleife fliege, aber trotzdem irgendwie an die Exception-Nachricht drankomme, um sie anzeigen zu können? |
Re: Design Problem: Exceptions in einer Schleife
versteh ich gerade nicht..
Delphi-Quellcode:
for ..
begin try .... Code except .... Message end // except end; // for |
Re: Design Problem: Exceptions in einer Schleife
Die Exceptions können im Constructor von TProcess auftreten, wenn die Eigenschaften ermittelt werden:
Delphi-Quellcode:
Deswegen, ich weiß nicht, ob deine Idee die Lösung ist. In dem Design steckt irgendwie der Wurm drine. :gruebel:
constructor TProcess.Create(PID: DWORD);
begin FProcID := PID; FModuleFilename := SetModuleFilename; FOwnerName := SetOwnerName; // Sets also FPOwnerSID, FOwnerStrSID FPriorityClass := SetPriorityClass; end; |
Re: Design Problem: Exceptions in einer Schleife
Moin Michael,
da sehe ich zwei Möglichkeiten:
BTW: Sollte die Methode nicht besser GetPriorityClass heissen? |
Re: Design Problem: Exceptions in einer Schleife
Zur Namensgebung:
Get und Set sind normalerwiese die Getter und Setter für die Eigenschaften. Da es aber keinen Sinn macht die Eigenschaft ProcID zu setzen, gibt es den Setter nicht. Für mich sind deshalb die Set-Funktionen, die Funktionen, die den Wert ermitteln und dem Attribut zu weisen. Auf Fehlercodes wollte ich nicht zurückgreifen, weil das für mich keine sauberer OOP-Lösung wäre. Zu deiner ersten Lösung: Das würde bedeuten ich müsste jeden Methoden aufruf zum Setzen der Attribute in einen try-except-Block kapseln. Hm, wäre möglich, sieht aber ziemlich blöd aus. Und was blöd aussieht ist meist auch falsch, für mich. ;) |
Re: Design Problem: Exceptions in einer Schleife
Moin Michael,
wenn Du Exceptions verwendest, bleibt Dir wohl nichts anderes übrig als diese auch dort abzufangen, wo sie auftreten können ;-) Zitat:
Zitat:
Zitat:
Ich finde, dass sollte so aussehen:
Delphi-Quellcode:
Was dann zur Folge hat, dass die Implementierung so aussieht:
property EineEigenschaft : TEinTyp read GetEineEigenschaft write SetEineEigenschaft;
Delphi-Quellcode:
Bei Dir sieht das aber, aller Voraussicht nach, so aus:
function TEineKlasse.GetEineEigenschaft : TEinTyp;
begin Result := FEinFeld; end; procedure TEineKlasse.SetEineEigenschaft(Value:TEinTyp); begin FEinFeld := Value; end;
Delphi-Quellcode:
Und wenn ich mir Deinen Konstruktor so anschaue:
property PriorityClass : DWORD read SetPriorityClass;
Die Getter-Methoden dienen dazu die Eigenschaften auszulesen, und nicht dazu die zugehörigen Felder zu initialisieren. Das könnte schon deshalb nicht funktionieren, da ja ein Getter, eigentlich, den Feldinhalt ausliest. |
Re: Design Problem: Exceptions in einer Schleife
Also für mich waren immer die Getter, die den Wert der Eigenscgaft zurückliefern und die Setter setzen sie. Oder verstehe ich da jetzt was falsch.
Und bei mir sieht es so aus:
Delphi-Quellcode:
Also nur Read-only Eigenschaften.
property Eigenschaft: TSomeType read GetEigenschaft
Und die Exceptions dort abzufangen, wo sie auftreten widerspricht der Verwendung von Exceptions. Der Anwender des Codes sollte entscheiden, was er mit den Exceptions macht. Deswegen habe ich auch eine eigene Exceptionsklasse, damit der Programmierer die Exceptions filtern kann. |
Re: Design Problem: Exceptions in einer Schleife
Moin Michael,
Zitat:
Du hast es, soweit ich das sehen kann, aber anders herum gemacht, denn das Auslesen von ProcessPriority machst Du über SetProcessPriority ;-) Zumindest sieht Dein Konstruktor für mich etwas seltsam aus... Zitat:
Wo sonst willst Du sie abfangen? (von einem globlen Exception-Handler mal abgesehen, der in Deinem Beispiel aber keinen Sinn macht) Zitat:
Und Du fängst die Exception ja auch ab, nur eben nach der Schleife, was aber für den konkreten Anwendungsfall wenig hilfreich ist. Wenn Du unmittelbar die Zeile in try/except kapselst, die den Fehler bekommen kann, kannst Du ja im Except-Abschnitt entsprechend reagieren, z.B., einen entsprechendes Flag in der dem gerade aktuellen Eintrag der Prozessliste setzen. Eine andere Variante: Du baust Dir eine Liste auf für alle Prozess-IDs, bei denen eine Exception ausgelöst wurde. Da ich davon ausgehe, dass der Aufbau der Liste mit zu einer Deiner Klassen gehört, könntest Du dann, für den Fall, dass mindestens ein Fehler aufgetreten ist, nach der Schleife, wiederum eine Exception auslösen, um dies kenntlich zu machen. Wenn sich hingegegen ein Anwender der Klasse eine Prozessliste aufbauen will, ist es dessen Problem, wie er das handelt. |
Re: Design Problem: Exceptions in einer Schleife
Zitat:
Zitat:
|
Re: Design Problem: Exceptions in einer Schleife
Moin Michael,
Zitat:
Eine Setter-Methode schreibt zwar den Wert eines Feldes, dass dann von aussen als Eigenschaft zugänglich ist, aber: Hier erfolgt der Zugriff auf das Feld innerhalb der Methode. Wie sieht denn die Deklaration der Eigenschaft ProcessPriority aus? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:34 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