| Autor |
Beitrag |
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Di 19.05.09 00:15
Hi!
Meine Probleme werden immer komplizierter
Die Indys wwerfen bekanntermaßen bei jeder Gelegenheit mit Exceptions um sich, wenn etwas schief gehen kann. Manchmal weiß man das aber, und müsste eigentlich die Exception unterdrücken. In einer DLL mache ich deswegen das:
Delphi-Quelltext 1: 2: 3: 4: 5:
| try res.Resolve(IPAddress); except on e:EIdDnsResolverError do ; end; |
Wenn ich jetzt per definierter Host-Anwendung die DLL debugge, kommt da die Exception trotzdem noch an. Klar, dafür bin ich ja im Debugger
Das Problem ist, dass eine Anwendung, die diese DLL nutzt, auch die Exception empfängt. Ist mir schleierhaft warum, schließlich geht den doch der DLL-Code gar nix an. Woher weiß also der Debugger, dass da eine Exception auftritt? Nach dem try...except sollte die doch nicht weiter gegeben werden, oder?
Ich könnte die jetzt zwar per Debugger-Setting ignorieren lassen, aber das ist mir halt nicht Granular genug, und irgendwo auch nicht ganz Sinn der Sache.
Wie werd ich diese Exception da jetzt los? Ich hab eigentlich nicht wirklich lust, mir da selber einen DNS-Resolver schrauben zu müssen.
Danke schonmal,
Sebastian
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 19.05.09 00:31
Die Exception tritt eben auf, ob in einer externen DLL oder nicht, ist dabei ja egal. Denn Exceptions kommen beim Betriebssystem an und dieses sucht dann nach jemandem, der sich darum kümmert. Und das ist eben der Debugger, wenn einer aktiv ist, egal ob die Exception danach abgefangen wird oder nicht.
Und dass der Debugger die Hostanwendung debuggt und nicht direkt die DLL spielt dabei keine Rolle, denn die DLL ist von dem Programm geladen. Und damit reicht das Betriebssystem die Exception auch dann an den Debugger weiter.
|
|
Martok 
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Di 19.05.09 01:33
Aha, ich dachte, der Debugger hängt sich an ein Modul. Alles klar
Einen "Hier gibts nichts zu sehen"-Compilerschalter gibts nicht zufällig? Dann darf ich nämlich doch einen Resolver selbst schreiben...
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 19.05.09 01:50
Martok hat folgendes geschrieben : | | Einen "Hier gibts nichts zu sehen"-Compilerschalter gibts nicht zufällig? |
Nein, Exception ist Exception, also kommt die auch zum Debugger. Was der dann damit macht, ist Sache des Debuggers.
Die Option Exceptions eines bestimmten Moduls auszuschließen, gibt es in Delphi nicht, man kann nur die Behandlung bestimmter Exceptiontypen festlegen.
Was stört das aber, dass in Delphi beim Debuggen die Exception angezeigt wird? Wenn das Programm normal läuft, passiert das ja nicht.
Martok hat folgendes geschrieben : | | Dann darf ich nämlich doch einen Resolver selbst schreiben... |
Was genau macht denn das Ding? Einfach nur einen Domainnamen auflösen? Das geht ja auch ganz simpel mit WinSock (getaddrinfo):
msdn.microsoft.com/e...ibrary/ms738520.aspx
|
|
Martok 
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Di 19.05.09 02:17
jaenicke hat folgendes geschrieben : | | Was stört das aber, dass in Delphi beim Debuggen die Exception angezeigt wird? Wenn das Programm normal läuft, passiert das ja nicht. |
Oh doch, da die Exception eben bei jedem nicht auflösbarem DNS fliegt. Und das sind so ca 40% der verarbeiteten.
Nicht ganz. Reverse DNS mach ich, also PTR abfragen. GetHostByAddr geht deswegen nicht weil der auch im NetBIOS rumfragt, hier hab ich dann zu allem Überfluss noch ewige Timeouts. Hatte ich auch neulich nen Thread zu
Was es aber gibt ist die DNSApi, inklusive Jedi-Header-Übersetzung in der JWAPI
Damit erstreckt sich mein Problem auf
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| uses jwawindns var dns:PDNS_RECORD; begin if DnsQuery('85.144.99.193.in-addr.arpa',DNS_TYPE_PTR,DNS_QUERY_STANDARD,nil,@dns,nil)=0 then ShowMessage(dns^.Data.PTR.pNameHost); |
Damit werfe ich dann zwar mit APIs um mich (IPHlp und Winsock sind schon drin), aber da die ab W2k supportet sind sollte das ja keine Probleme geben.
Thread gelöst, wenn auch anders als gedacht, würd ich sagen.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
|