![]() |
eigene Fehlercodes als Rückgabewert definieren
Hi
Ich möchte gerne eigene Fehlercodes für meine Funktionen definieren. Blöd ist halt, daß Funktionen selbst ja einen Wert zurückliefern und somit kein Platz für Fehlercodes ist. Um das zu umgehen, dachte ich mir, einfach jeder Funktion noch einen Zeiger mitzugeben, den ich nach der Beendigung der Funktion auslese, um so an die Fehlercodes zu gelangen. Jetzt hätte ich gerne gewußt, ob so eine Vorgehensweise in Ordnung ist oder es evtl. noch andere Möglichkeiten gibt. Ich zeige Euch mal den Quellcode. (der funktioniert übrigens recht gut)
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type recErrorCode = record ECode:integer; desc:string; end; PErrorCode = ^recErrorCode; TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Label2: TLabel; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; TSchnulli = class(TObject) strict private Pinselei:TStringList; Pinselei2:TStringList; public constructor create(); destructor destroy; procedure addText(text:string;var ECode:PErrorCode); function getText(index:integer; var ECode:PErrorCode):string; end; var Form1: TForm1; implementation {$R *.dfm} constructor TSchnulli.create; begin Pinselei:=TStringList.Create; Pinselei2:=TStringList.Create; end; destructor TSchnulli.Destroy; begin FreeAndNil(Pinselei); FreeAndNil(Pinselei2); end; procedure TSchnulli.addText(text:string; var ECode:PErrorCode); Begin Pinselei.Add(text); ECode.ECode:=0; ECode.desc:='Fein, hat alles geklappt.'; End; function TSchnulli.getText(index:integer; var ECode:PErrorCode):string; var erg:string; Begin erg:=''; if index < Pinselei.Count then Begin erg:=Pinselei.Strings[index]; ECode.ECode:=0; ECode.desc:='Sehr schick.'; End else Begin ECode.ECode:=27; ECode.desc:='Index ist zu hoch. Die Zeile ist doch garnicht da. :-('; End; result:=erg; End; procedure TForm1.Button1Click(Sender: TObject); var bla:TSchnulli; ECode:PErrorCode; text:string; Begin bla:=TSchnulli.create; // Text einfügen new(ECode); bla.addText('Butzibär',ECode); Label1.Caption:='ErrorCode: '+inttoStr(ECode.ECode) + ' *** ErrorDesc: '+ECode.desc; dispose(ECode); // Text auslesen new(ECode); text:=bla.getText(1,ECode); Label2.Caption:='ErrorCode: '+inttoStr(ECode.ECode) + ' *** ErrorDesc: '+ECode.desc; dispose(ECode); button1.Caption:=text; FreeAndNil(bla); end; end. |
AW: eigene Fehlercodes als Rückgabewert definieren
Wieso programmierst Du nicht so etwas wie GetLastError nach? Du deklarierst Deinen Record einfach als Feld von TSchnulli und befüllst ihn im Fehlerfall dort. Willst Du ihn auswerten, kannst Du das dann an zentraler Stelle tun.
|
AW: eigene Fehlercodes als Rückgabewert definieren
Und wieso nicht einfach mit Exceptions arbeiten? Fehlercodes sind doch Schrott.
|
AW: eigene Fehlercodes als Rückgabewert definieren
Zitat:
Zitat:
|
AW: eigene Fehlercodes als Rückgabewert definieren
Zitat:
*ALLE* modernen Programmiersprachen setzen auf Exceptions weil es einfach der bessere Weg ist mit Fehlern zur Laufzeit umzugehen. ![]() ![]() |
AW: eigene Fehlercodes als Rückgabewert definieren
Beispiel 1:
Delphi-Quellcode:
Beispiel 2:
Prozedur1(xy,ErrorCode);
if ErrorCode = Prozedur1WarOK then begin Prozedur2(xy,ErrorCode); if ErrorCode = Prozedur2WarOK then begin Prozedur3(xy,ErrorCode); if ErrorCode = Prozedur3WarOK then ShowMessage('Funzt') else Fehlerbehandlung(ErrorCode); end else Fehlerbehandlung(ErrorCode); end else Fehlerbehandlung(ErrorCode);
Delphi-Quellcode:
1. Welcher Code ist übersichtlicher?
Try
Prozedur1(xy); Prozedur2(xy); Prozedur3(xy); ShowMessage('Funzt') Except On E:Exception Do Fehlerbehandlung(E); End; 2. Welcher Code ist leichter zu verändern? 3. Welcher Code ist verständlicher? |
AW: eigene Fehlercodes als Rückgabewert definieren
@Gargamel:
An sich ist es schon richtig wie du es machst. Allerdings ist es unüblich den Fehlercode über var/out Parameter zurück zu liefern und das Ergebnis per result. In der Regel wird es genau umgekehrt gemacht. Denn was soll die Funktion zurück geben wenn ein Fehler aufgetreten ist? Zudem lässt sich bei Fehlercodes per Result einiges etwas kürzer schreiben:
Delphi-Quellcode:
if FunktionsAufruf(Ergebnis) = RES_SUCCESS then
DoAnything; Zitat:
Stell dir vor StrToIntDef etc. würden mit Exceptions arbeiten, und durch abfangen dieser das Ergebnis zurück liefern. Man hätte ganz viel Spaß beim debuggen und langamer wäre das ganze auch. @FredlFesl: schlechtes Beispiel. Es ginge auch so:
Delphi-Quellcode:
oder wenn die Funktion per result den Fehler zurück gibt:
if Funktion1(aRes) and Funktion2(aRes) and Funktion3(aRes) then
showmessage('success') else showmessage(ErrCodeToString(aRes));
Delphi-Quellcode:
function CheckOK(aRes: Integer; out atErr): boolean;
begin result := true; if aRes <> RES_SUCCESS then begin aLastErr := aErr; end; end; procedure Test; var lErr: Integer; begin if CheckOk(Funktion1(aRes),lErr) and CheckOk(Funktion2(aRes),lErr) and CheckOk(Funktion3(aRes),lErr) then showmessage('success') else showmessage(ErrCodeToString(lErr)); |
AW: eigene Fehlercodes als Rückgabewert definieren
Zitat:
Im .NET Framework sind Exceptions aber von Anfang an etabliert. Dort werden sogar verschachtelte Exception unterstützt was Delphi leider bislang noch fehlt. Zitat:
Es kommt eben auch immer auf die Abstraktionsebene an auf der man sich bewegt. In einem Treiber oder einer normalen DLL möchte man sicher keine Exceptions nach aussen geben. Bei einer Active-X DLL oder einer ganz normalen Delphi-Anwendung sieht die Sache schon ganz anderst aus. |
AW: eigene Fehlercodes als Rückgabewert definieren
Da hier gerade die Begriffe DLL und Delphi-Anwendung fielen: Ich hätte evtl. erwähnen sollen, daß der Code tatsächlich in eine DLL soll. Sorry, war mein Fehler.
|
AW: eigene Fehlercodes als Rückgabewert definieren
Zitat:
Wenn du ganz "stinknormale" Funktionen in deiner DLL hast wie z.B.
Delphi-Quellcode:
dann ist es üblich den Fehlercode als Result zurückzugeben.
function MachWas(inparam1:integer; var ergparam:PChar):integer; Stdcall;
Wenn du aber mit Objekten und Klassen arbeiten willst, dann kommst du mit einer normalen DLL nicht weiter. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:04 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 by Thomas Breitkreuz