AGB  ·  Datenschutz  ·  Impressum  







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

Fehlerbehandlung bei dll

Ein Thema von nezumi7 · begonnen am 31. Jul 2021 · letzter Beitrag vom 6. Aug 2021
Antwort Antwort
nezumi7

Registriert seit: 11. Apr 2011
67 Beiträge
 
#1

Fehlerbehandlung bei dll

  Alt 31. Jul 2021, 06:21
Liebe Profis,

ich habe vor Jahren einmal in Delphi6 ein Programm geschrieben, das mir meine Kontobuchungen ordnet (schlichtes Auswerten von Textdateien). Dabei war vorgesehen, dass in ein paar wenigen Fällen ein Wechselkurs aus dem Internet abgerufen wird.

Mittlerweile funktioniert letzteres nicht mehr, weil es kaum noch ungesicherte Internetseiten gibt und Delphi6 und https nicht geht oder zumindest recht mühsam ist.

Ich habe daher den Internetaufruf in einer brandaktuellen Delphi-Version geschrieben und in eine dll gepackt, die dann von meinem Delphi6-Programm verwendet wird:

dll:
Delphi-Quellcode:
library internet;

uses
  System.SysUtils,
  System.Classes,
  System.Net.URLClient,
  System.Net.HttpClient,
  System.Net.HttpClientComponent;

{$R *.res}

function get_course(url: ShortString): shortstring; stdcall;
var
  HttpClient: THttpClient;
  HttpResponse: IHttpResponse;
 begin
Result := '';

HttpClient := THTTPClient.Create;
  try
    HttpResponse := HttpClient.Get(url);
    vtext := HttpResponse.ContentAsString();
  finally
    HttpClient.Free;
  end;

{es folgt eine längere Auswertung des Seitenquelltextes, der Kurs wird dann ins Result geschrieben. Hier liegt nicht das Problem}  
  end;

exports
  get_course;
begin
end.

Host:
Delphi-Quellcode:
implementation

{$R *.dfm}

function get_course(url: ShortString): Shortstring; stdcall; external 'internet.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin

Edit2.Text := get_course(Edit1.text);

end;
Klappt alles wunderbar, das Problem ist nur: wenn die Internetverbindung unterbrochen ist, geht gar nichts mehr, das ganze Programm hängt sich total auf, trotz try/ error beim Aufruf.

Für mich ist dll völlig neu, offenbar gelten hier andere Regeln beim Fehlerhandling. Hat jemand eine Idee, wie man das machen kann? (Quick and dirty würde vollkommen reichen. Ich brauche keine Fehlermeldung, es reicht, wenn die Funktion bei einem Fehler einfach gar nichts zurück gibt. Wichtig ist mir nur, dass sich bei Problemen mit der Internetverbindung nicht alles aufhängt.....
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.332 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Fehlerbehandlung bei dll

  Alt 31. Jul 2021, 08:41
Du kannst in Delphi 6 soweit ich das sehe auch noch die aktuellste Indy-Version verwenden, zumindest gibt es dort im Lib-Verzeichnis noch eine Batchdatei dafür:
https://github.com/IndySockets/Indy/tree/master/Lib

Und zu den Fehler:
Das funktioniert bei mir problemlos. Wie hast du den Fehler denn abgefangen? Bei mir landet die DLL (wie es sein soll) im try..except und gibt einen Leerstring zurück.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Fehlerbehandlung bei dll

  Alt 31. Jul 2021, 10:15
Ich sehe nirgendwo ein try..except . Das sollte in deiner DLL sein damit die Exception die DLL nicht verlässt.
Kannst du die entsprechende Stelle mal zeigen?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#4

AW: Fehlerbehandlung bei dll

  Alt 31. Jul 2021, 11:56
Das Einzige, wo eine Delphi-Exception die DLL verlassen darf, ist, wenn die aufrufende EXE/DLL "ebenfalls" mit Laufzeitpackages kompiliert wurde.

Ansonsten sind die "Klassen" inkompatibel und du hast nur eine der anderen Wahl(en):
* Status/ErrorCode im Result
* SetLastError/GetLastError
* oder eine eigene "LastError"-Methode (so kann man auch Error-Texte rausgeben)
* u.ä.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (31. Jul 2021 um 12:12 Uhr)
  Mit Zitat antworten Zitat
nezumi7

Registriert seit: 11. Apr 2011
67 Beiträge
 
#5

AW: Fehlerbehandlung bei dll

  Alt 31. Jul 2021, 13:17
@Sebastian
Das ist ja sehr interessant, dass das bei Dir funktioniert! Du sprichst von einem try/except: Hast Du den Aufruf im Host nochmal in ein try except gepackt?

Sehr dankbar bin ich Dir für den Hinweis auf das aktuelle Indy. Ich hatte da gar nicht mehr nachgesehen, weil ich vor einiger Zeit schon mal gelesen hatte, dass Indy nur bis zur Version 10.2 oder sowas mit D6 kompatibel ist. scheinbar unterstützt diese Version aber nur die Protokolle TLS 1.0 und 1.1, die aber von der gewünschten Internetseite nicht mehr akzeptiert werden. Ich hatte daher immer eine "reset by peer" Fehlermeldung bekommen. Ich werds jetzt aber gleich nochmal mit dem aktuellen Indy probieren, das ist mir eh lieber als das Rumgefrickel mit dlls.

@Günther
Ich habe im gesamten restlichen Code kein try/except, weil da eigentlich nichts mehr schief gehen kann. Das einzige try (/ finally) hatte ich oben schon gepostet. Ist Deine Anmerkung so zu verstehen, dass ich besser mit einem try/except (anstelle try/finally) arbeiten sollte, damit die Exception die dll nicht verlässt? (In diese Richtung scheint mir auch der Hinweis von himitsu zu gehen, wobei die Ausführungen für mich aber starker Tobak sind und weit über meinen Hobby-Programmier-Horizont hinausgehen....).
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Fehlerbehandlung bei dll

  Alt 31. Jul 2021, 13:56
Und wie wäre es das Hauptprogramm auf aktuelle Delphi-Version zu bringen.
Wir waren lange selbst auf D6.
Die Produktivitätssprung mit aktuellen Delphi ist gegenüber D6 gewaltig.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.332 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Fehlerbehandlung bei dll

  Alt 5. Aug 2021, 13:31
Du sprichst von einem try/except: Hast Du den Aufruf im Host nochmal in ein try except gepackt?
Ich habe beides ausprobiert. Egal ob ein der DLL oder der Hostanwendung funktioniert das try..except normal wie erwartet.

Ich habe im gesamten restlichen Code kein try/except, weil da eigentlich nichts mehr schief gehen kann. Das einzige try (/ finally) hatte ich oben schon gepostet.
Nun ja, wenn du den Fehler gar nicht abfängst, weil du kein try..except drin hast, wird er auch nicht abgefangen...
try..finally reicht die Exception ja weiter, denn es sorgt ja nur dafür, dass der Code im finally trotz eines Fehlers ausgeführt wird. Es fängt die Exception aber nicht ab.
Wenn du das dann an der falschen Stelle aufrufst, mag es auch Folgeprobleme geben.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
629 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Fehlerbehandlung bei dll

  Alt 6. Aug 2021, 18:00
@Sebastian
Das ist ja sehr interessant, dass das bei Dir funktioniert! Du sprichst von einem try/except: Hast Du den Aufruf im Host nochmal in ein try except gepackt?

Sehr dankbar bin ich Dir für den Hinweis auf das aktuelle Indy. Ich hatte da gar nicht mehr nachgesehen, weil ich vor einiger Zeit schon mal gelesen hatte, dass Indy nur bis zur Version 10.2 oder sowas mit D6 kompatibel ist. scheinbar unterstützt diese Version aber nur die Protokolle TLS 1.0 und 1.1, die aber von der gewünschten Internetseite nicht mehr akzeptiert werden. Ich hatte daher immer eine "reset by peer" Fehlermeldung bekommen. Ich werds jetzt aber gleich nochmal mit dem aktuellen Indy probieren, das ist mir eh lieber als das Rumgefrickel mit dlls.

@Günther
Ich habe im gesamten restlichen Code kein try/except, weil da eigentlich nichts mehr schief gehen kann. Das einzige try (/ finally) hatte ich oben schon gepostet. Ist Deine Anmerkung so zu verstehen, dass ich besser mit einem try/except (anstelle try/finally) arbeiten sollte, damit die Exception die dll nicht verlässt? (In diese Richtung scheint mir auch der Hinweis von himitsu zu gehen, wobei die Ausführungen für mich aber starker Tobak sind und weit über meinen Hobby-Programmier-Horizont hinausgehen....).
Delphi-Quellcode:
library internet;

uses
  System.SysUtils,
  System.Classes,
  System.Net.URLClient,
  System.Net.HttpClient,
  System.Net.HttpClientComponent;

{$R *.res}

function get_course(url: ShortString): shortstring; stdcall;
var
  HttpClient: THttpClient;
  HttpResponse: IHttpResponse;
 begin
  Result := '';

  HttpClient := THTTPClient.Create;
  try
    try
      HttpResponse := HttpClient.Get(url);
    except
      // hier irgendwas machen, was du willst z.B. je anch Exeption etwas anderes (Siehe Hilfe zu try except).
      vtext := '';
    end;
    if vtext <> 'then
      vtext := HttpResponse.ContentAsString();
  finally
    HttpClient.Free;
  end;

{es folgt eine längere Auswertung des Seitenquelltextes, der Kurs wird dann ins Result geschrieben. Hier liegt nicht das Problem}  
  end;

exports
  get_course;
begin
end.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.332 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Fehlerbehandlung bei dll

  Alt 6. Aug 2021, 19:55
Wie soll denn dort vtext etwas anderes als einen Leerstring bekommen?
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#10

AW: Fehlerbehandlung bei dll

  Alt 6. Aug 2021, 21:10
Noch besser, wenn es knallt, dann richtig, da HttpResponse nicht initialisiert wurde, wenn .GET abgeraucht ist.
Aber zum Glück überspringt das IF nach dem EXCEPT-END den Code, damit es nicht knallen kann.

Meckert denn der Complier hier nicht über eine "nicht initialisierte Variable" ?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:22 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