Einzelnen Beitrag anzeigen

Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#13

Re: Eigene Fehlercodes / Fehlermeldungen erstellen/verwalten

  Alt 21. Feb 2010, 17:50
Also ersteinmal würde ich Fehlermeldungen, die von Funktionen zurückegeben werden, nicht in Delphi verwenden. Dafür gibt es Exceptions, die ganz einfach einen String als Meldung bekommen, so dass du siehst, was passiert.
Aus meiner Erfahrung kann ich sagen, dass Programmierer gerne das Prüfen der Rückgabewerte vergessen und dann merkwürdige Ergebnisse bekommen.

Als Außnahme lasse ich gelten, wenn
  • die Funktionen sehr, sehr oft aufgerufen werden soll und genauso oft einen Fehler melden muss (sehr selten). Exceptions verlangsamen den Aufruf nur dann, wenn sie ständig geworfen werden, nicht jedoch, wenn der reguläre Ausführungspfad durchgeführt wird. Siehe Kaptitel Exceptions bei Dr. Bob.
  • die Funktionen in eine DLL gepackt werden sollen und damit von anderen Sprachen verwendet werden.

Du kannst von der Klasse Exception, einfach neue Fehlertypen ableiten, so wie das in der JWSCL gemacht wird.

EMyException = class(Exception);
Also, falls keine Exceptions verwendet werden sollen, so kannst du eigene Meldungen in einer Ressource, ähnlich der Stringresource, speichern, so dass auch verschiedene Sprachen möglich sind.

Windows verwendet dazu den Resourcentype MessageTable, den man ins Modul einbindet und mit FormatMessage und FORMAT_MESSAGE_FROM_HMODULE.

Dann kannst du eigene Fehlermeldungen z.B. mit SetLastError setzen bzw direkt zurückgeben. Dazu kannst du HRESULT verwenden, der es ermöglicht etwas flexibler zu sein. Deine Meldungscodes stecken dann im rechten Codefeld drin und können ohne Probleme bei 1 anfangen. Der Facilitycode ist eine ID, die angibt, welcher Bereich einer Software die Meldung erzeugt hat. So kann man dann herausfinden, dass eine Meldung von einem Funktionsaufruf innerhalb der aufgerufenen Methode stammt.
Setze außerdem das Custom Bit auf 1, damit es keine Verwechslung mit möglicherweise im SYSTEM vorhandenen Fehlercodes gibt.
Alle Werte >= 0 sind Erfolgsmeldungen, daher kann man auch extra Meldungen, wie z.B. "Aufruf erfolgreich, aber mehr Daten vorhanden." zurückliefern.

In ActiveX.pas gibt es einige Funktionen, die dir da helfen können.
Delphi-Quellcode:
function Succeeded(Res: HResult): Boolean; inline;
function Failed(Res: HResult): Boolean; inline;
function ResultCode(Res: HResult): Integer; inline;
function ResultFacility(Res: HResult): Integer; inline;
function ResultSeverity(Res: HResult): Integer; inline;
function MakeResult(Severity, Facility, Code: Integer): HResult; inline;
Leider kann man das Customerbit damit nicht setzen, deshalb so:
Error := Error or $20000000; Natürlich wäre ich begeistert, wenn du das so machen würdest und diese Idee auf dem JEDI Blog veröffentlichen würdest (also eine Demoapp). Falls du Interesse hast, dann einfach bei mir melden. Unterstützung ist garantiert.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat