AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

eigene Fehlercodes als Rückgabewert definieren

Ein Thema von Gargamel · begonnen am 5. Jul 2011 · letzter Beitrag vom 14. Jul 2011
Antwort Antwort
Seite 2 von 2     12   
Gargamel

Registriert seit: 19. Mär 2007
171 Beiträge
 
#11

AW: eigene Fehlercodes als Rückgabewert definieren

  Alt 5. Jul 2011, 19:42
Die Klassen arbeiten nur innerhalb der DLL. Die Kommunikation zwischen Anwendung und DLL erfolgt über ganz normale Funktionen.
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#12

AW: eigene Fehlercodes als Rückgabewert definieren

  Alt 12. Jul 2011, 09:08
@FredlFesl: schlechtes Beispiel.
Es ginge auch so:
Delphi-Quellcode:
if Funktion1(aRes) and Funktion2(aRes) and Funktion3(aRes) then
  showmessage('success')
else
  showmessage(ErrCodeToString(aRes));
Das ist keine Äquivalenzumformung meines Beispielcodes, also ginge es *NICHT* so.
Gegenfrage:
-In welcher Reihenfolge werden die Funktionen aufgerufen? (links nach rechts? rechts nach links?)
-Werden alle Funktionen aufgerufen? (Stichwort: Compilerschalter)

Beispiel für ein schlechtes Beispiel gefällig?
Code, dessen Funktionsweise von Compilerschaltern und der Sprachenphilosophie abhängt!

Sechs, setzen.

Na, sagen wir: Vier miiinus.
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#13

AW: eigene Fehlercodes als Rückgabewert definieren

  Alt 12. Jul 2011, 13:18
Die Funktionen werden von Links nach Rechts aufgerufen.
Und ja, das ganze ist vom Compilerschalter abhängig. Ebenso wie viele Funktionen in der Unit SysUtils.
Somit ist das ganze an einen Compilerschalter gebunden der nahezu immer notwendig ist.
Ich würde es auch nicht generell verurteilen Quelltext an Compilerschalter anzupassen. Ich würde das eher Optimierung nennen.
Zum Beispiel knallt folgender Quelltext bei einem Leerstring wenn die Bereichsprüfung an ist weil angeblich auf Index 1 des Strings zugegriffen wird (was durch die Lengthangabe aber nicht stört)
move(LeerString[1], MyBuffer[0], Length(LeerString)); Jetzt könnte man da eine Prüfung der Länge davor setzen aber warum eine zusätzliche Anweisung einbauen die bei einem selbst nicht notwendig ist.

Also bitte keine 4- sondern eine 3+
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#14

AW: eigene Fehlercodes als Rückgabewert definieren

  Alt 12. Jul 2011, 17:02
Wenn du über DLL-Grenzen hinwegarbeitest bietet sich die Aufrufkonvention "SafeCall" an. SafeCall gibt immer zusätzlich zum eigentlichen Rückgabewert einen zweiten Rückgabewert vom Typ HResult mit. Und die Logik dahinter macht Delphi automatisch,

Ich hab grad kein Delphi hier um das nochmal zu testen, aber folgendes sollte funktionieren (auch über DLL-Grenzen hinweg):
Delphi-Quellcode:
//in DLL
function myDiv(a,b:Integer):Integer;safecall;
begin
  if b<>0 then
    result:=a div b
  else
    raise Exception.create('Du Idiot, wenn man durch null teilt, landet man beim schwarzen Mann.');
end;



//in Exe
function mydiv(a,b:Integer):Integer; safecall;
  external myDLL;

begin
  try
    mydiv(4,0);
  except
    on E:Exception do
      showmessage(e.MEssage); //ich glaube Delphi kriegt die Message nicht wirklich durch, aber schau mal.
  end;
end.
Mit SafeCall kannst du auch deine eigenen Fehlercodes mitgeben. Aber dazu bräuchte ich jetzt doch mal ein Delphi.
Es müsste in etwa so gehen:
Delphi-Quellcode:
//in DLL
function myDiv(a,b:Integer;out res:Integer):HResult;stdcall; //dies entspricht derselben Aufrufkonvetnion wie oben
begin
  if b<>0 then
  begin
    res:=a div b;
    result:=s_ok;
  end else
  begin
    res:=0; //ist egal
    result:=-80; // lustiger Fehlercode, muss negativ sein (bzw. MSB muss gesetzt sein)
  end;
end;

//der Exe-Teil sollte genau gleich aussehen (auch mit safecall)
//die Exception wirft das Hauptprogramm automatisch, wenn der Fehlercode bestimmte Werte annimmt, ich hoffe die 80 reicht dazu.
Edit: Korrektur: Fehlercode muss negativ sein.
Als Ergänzung kannst du in der Exe, sofern du kein ActiveX nutzt (also unit comobj nicht einbindest), die globalew Variable SafeCallErrorProc umsetzen:
Delphi-Quellcode:
procedure SafeCallError(ErrorCode: Integer; ErrorAddr: Pointer);
var adr:Pointer;
begin
  raise Exception.Create('Fehlercode' + inttostr(ErrorCode) );
end;

initialization
SafeCallErrorProc:=@SafeCallError;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.

Geändert von sirius (12. Jul 2011 um 23:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#15

AW: eigene Fehlercodes als Rückgabewert definieren

  Alt 14. Jul 2011, 01:41
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.
StrToIntDef ist ein schlechtes Beispiel, da diese Funktion immer definiert ist und "nicht" scheitern kann (alle möglichen Argumente sind gültig, nicht böses zu tun).
Wenn du dir StrToInt anguckst, wirst du eine Exception bekommen, wenn du irgendwas merkwürdiges Konvertieren willst.

In beiden Fällen gibt es keine Fehlerrückgabewerte (es sei denn man missbraucht IntToStrDef dazu, indem man einen ungewöhnlichen Defaultwert angibt).



Die Diskussion mit der Geschwindigkeit gab es hier auch schon mal, dabei kam afaik heraus, dass Try-Except wenig kostet, solange keine Exceptions auftreten (dann ist eh was falsch gelaufen).
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:27 Uhr.
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