Exception in Dll fangen
-
Hallo, folgendes Problem:
Ich habe eine Dll gekriegt, die ich weiterentwickeln soll. Ich weiss nicht so ganz genau, wie ich von der Hauptapplikation aufgerufen werde. Aber ich denke mal mit LoadLibrary und GetProcAdress usw.
Jedenfalls mach ich sowas da in meiner Dll:
try { CMyClass * pClass = NULL; pClass->foo(); } catch(...) { bittespringhierrein(); }Und er springt nicht hierrein

Was muss ich machen, damit meine Dll Exceptions fängt? Bei einer Exception wird sofort in die Hauptapplikation gesprungen!!
-
electron schrieb:
Jedenfalls mach ich sowas da in meiner Dll:
CMyClass * pClass = NULL; pClass->foo();Und wieso zur Hoelle sollte man soetwas tun? ^^
Sorry aber das ist afaik nonsense.
Wenn du eine Exception willst musst du eine werfen (throw). Das Dereferenzieren eines Nullzeigers loest meines Wissens aber keine aus, sondern verursacht einen Speicherzugriffsfehler (oder was auch immer).
Dein Problem ist also nicht das Exception fangen sondern das Erzuegen (der Code fuer Fangen erscheint mir korrekt).Gruss,
DeSoVoDaMu
-
Danke für deine Antwort. Leider hilft mir deine Antwort gar nicht weiter.
Mein Code ist nur Beispiel. Ziel ist es, eine Exception dieser Art zu fangen. Das muss funktionieren, tut es aber nicht.
Meine Frage ist warum? Und was muss ich in der Dll machen, dass ich die Exceptions fangen kann.Gruß
-
Wenn du eine Exception willst musst du eine werfen (throw).
Das Dereferenzieren eines Nullzeigers loest meines Wissens aber keine aus, sondern verursacht einen Speicherzugriffsfehler (oder was auch immer).
Dein Problem ist also nicht das Exception fangen sondern das Erzuegen (der Code fuer Fangen erscheint mir korrekt).Gruss,
DeSoVoDaMuich glaub er will damit sagen das der aufruf pClass->foo(); keine Exception wirft, sondern dein Betriebsystem zu nem Aufstand veranlasst
warum fragst du null-pointer nicht einfach ab eh du versucht was aufzurufen und machst dann einfach ein throw()
-
Wow, schreibe ich in solchen Raetseln, dass ich noch einen Uebersetzer brauche und sich selbst dieser nicht sicher ist, was ich gemeint habe? oO (nichts fuer ungut, ist nicht boese gemeint ;D)
Es steht doch eigentlich alles da.
Um eine Exception fangen zu koennen muss eine vorhanden sein (-> geworfen werden). Wer das macht ist ansich egal und von welchem Typ sie ist auch (da du ja catch(...) geschrieben hast).
Wenn du aber ueber einen Zeiger auf NULL auf ein Variable oder eine Methode zugreifen willst, wird KEINE Exception geworfen, sondern das Verhalten ist undefiniert und das Programm stuerzt mit hoher Wahrscheinlichkeit ab.
Damit solltest du diese AussageZiel ist es, eine Exception dieser Art zu fangen.
jetzt als falsch erkennen koennen und sehen, wo dein Fehler liegt

Gruss,
DeSoVoDaMu
-
mit "ich glaub er will damit sagen" wollt ich nur zum ausdruck bringen, das ich mir da auch nicht ganz sicher bin.... ich dachte das würde trotzdem ne exception geben, da hab ich mich aber geirrt, obwohl mir der BCB n bisschen zu pingelig iss um vernünftig mit exceptions zu debuggen.
allgemein würde ich an so einer nullpointersache eher auf obj == null prüfen als ne exception zu erwarten, das ist einfach nur unschön programmiert.
exceptions in C++ sind mir absolut ungeheuer, belehrt mich eines besseren
-
OK, wenn euch mein Beispiel nicht gefällt, dann eben ein anderes:
try{ MSXML2::IXMLDOMDocumentPtr pDocument("Msxml2.DOMDocument.4.0"); pDocument->load(bstrPath); hr = pDocument->save(bstrPath); } catch(...) { }Wenn meine XML readonly Attribut hat, dann sollte eigentlich ein neg hr zurückgegeben werden, oder eine COM Exception geworfen werden. Aber beides passiert nicht. Das ist mein Problem. Könnte mir da jetzt vielleicht jemand einen Hinweis geben, um diesen jetzt praktischen Beispiel zu handeln.
Sorry für mein unpraktisches Beispiel, aber ich dachte das veranschaulicht ganz praktisch das Problem das ich hab.
Gruß
-
electron, ich denke du hast mehr als nur 1 Problem (mit deinem Code).
Von daher bringen auch die tollen Beispiele nix die du postest, da jedesmal andere Dinge schuld sein könnten.Wenn du nur grundsätzlich wissen willst ob das mit Exception Handling funktioniert dann schreib doch so nen test:
void foo() { try { throw int(123); } catch (int i) { // ... } }...und guck was passiert.
-
Danke hustbaer, also diese Beispiel funktioniert in der Dll und hüpft schön brav in den catch-Block.
Die anderen 2 Beispiele jedoch? Versteh ich nicht.
-
Also nochmal zu ersten Beispiel, obwohl das bereits erklärt wurde: es wird deswegen keine Exception gefangen, weil keine geworfen wird. Und geworfen wird keine, weil nirgends Code steht der eine werfen würde. Wie viel einfacher kann man es noch formulieren?
Dass du einen Nullpointer dereferenzierst ist ein Programmierfehler, aber wenn du dir erwartest dass bei jedem Programmierfehler irgendwo irgendwie eine Exception geworfen würde hast du Exceptions nicht verstanden.
In dem speziellen Fall "Nullpointer dereferenzieren" gibt es zwar z.B. unter Windows eine Möglichkeit wie man zu seiner Exception kommt (-> _set_se_translator), aber das hat mit dem C++ Standard rein garnichts zu tun. Hier geht es um SEH (Structured Exception Handling), da steckt zwar auch das Wort Exception drinnen, hat aber trotzdem mit C++ Exceptions nicht viel zu tun.
Zum 2. Beispiel: das kann 101 Gründe haben wieso du da keine Fehler bekommst. Das hat aber weder mit DLLs noch mit C++ Exceptions zu tun. Ich denke da wirst du dir wohl die Klasse "Msxml2.DOMDocument.4.0" angucken müssen, ggf. ist das einfach "by design". Probier doch einfach mal ein vorhandenes XML Dokument zu laden, und das dann auf z.B. "Z:\\xxx\\foo.xml" zu speicher, vorausgesetzt den Ordner gibt es bei dir nicht. Oder speicher es in einen Ordner auf den du dir vorher selbst Schreibrechte wegnimmst.
Ansonsten lies die Doku zu der COM Klasse, da muss eigentlich drinnen stehen wann eine Operation einen "failed" zurückliefert und wann "success".Kurz: du hast hier kein grundsätzliches Problem mit Exceptions oder DLLs, sondern 2 verschiedene "Probleme", die bloss beide dazu führen dass keine Exception geworfen wird wo du dir eine erwartest.