C++ Biblithek in C Programm: keine Exceptions ?

Von: , Frage gestellt am Mo, 7. Mai 2001

Ich habe eine (dynamisch gelinkte) Bibliothek in C++ geschrieben (Linux), die ich nun als Modul in den Apache-Server (C-Code) (logischerweise auch Linux) einbinden möchte. Das ganze klappt auch soweit ganz gut.

Mein Problem ist allerdings, dass die Bibliothek Exceptions verwendet, um Fehler zu melden. Jedes Mal, wenn jedoch eine Exception geworfen wird, stirbt der entsprechende Server-Prozess mit einem SIG_ABORT (sollte eigentlich einen core-dump liefern, was es allerdings nicht tut) und ohne weitere Angabe von Gründen: kein Error-Log, keine Fehlermeldung, nix.

Ich denke nicht, dass das Problem mit dem Apache zusammenhängt, sondern ein allgemeines Problem ist, wenn man versucht C und C++ zu mixen.

Meine Vermutung: der Startup-Code der Bibliothek wird von C nicht korrekt aufgerufen und das Exception-Handling daher nicht initialisiert.

Hat jemand eine Idee, was man dagegen tun kann?

Ok, man könnte natürlich den Apache mit nem C++ Compiler neu bauen, aber das will man nicht wirklich... ;-)

Thanx im voraus!

Marc

17 Antworten zu dieser Frage

  1. Antwort von nach einer Stunde 0 hilfreich
    Re: C++ Biblithek in C Programm: keine Exceptions

    Moin, Mein Problem ist allerdings, dass die Bibliothek Exceptions
    verwendet, um Fehler zu melden. Jedes Mal, wenn jedoch eine
    Exception geworfen wird, stirbt der entsprechende
    Server-Prozess mit einem SIG_ABORT (sollte eigentlich einen
    core-dump liefern, was es allerdings nicht tut) und ohne
    weitere Angabe von Gründen: kein Error-Log, keine
    Fehlermeldung, nix.
    1. Fängst Du den SIGABRT?
    2. Bei SuSE sind cores in der /etc/profile abgestellt.

    Thorsten

    • Antwort von nach 2 Stunden 0 hilfreich
      Re^2: C++ Biblithek in C Programm: keine Exception

      1. Fängst Du den SIGABRT?
      Nein, Ich will ja keine Signalbehandlung via logjump und so machen, sondern "echte" C++ Exceptions mit try-catch. 2. Bei SuSE sind cores in der /etc/profile abgestellt.
      Danke das ist nen guter Hinweis, vielleicht hilft das was

      Marc

      • Antwort von nach 2 Stunden 0 hilfreich
        Re: C++ Biblithek in C Programm: keine Exception

        Moin, 1. Fängst Du den SIGABRT?
        Nein, Ich will ja keine Signalbehandlung via logjump und so
        machen, sondern "echte" C++ Exceptions mit try-catch.
        Ich weiß nicht viel von dieser Problematik, aber ich kenne kein C-Schlüsselwort 'try'.
        Wenn die Exceptions im C-Teil als SIGABRT gesehen werden, mußt Du den wohl fangen.

        Thorsten

        • Antwort von nach 2 Stunden 0 hilfreich
          Re^2: C++ Biblithek in C Programm: keine Exception

          kein C-Schlüsselwort 'try'.
          'try', 'catch' und 'throw' sind auch Spracherweiterungen von C++. 'try' leitet einen Code-Block ein, in dem eine Exception auftreten kann, eine 'catch' Block gibt einen Codeberech an, der ausgeführt werden soll, wenn eine Exception eines bestimmten Typs geworfen wird (mit 'throw', z.B aus einer Funktion innerhalb des 'try' Blocks). Typ kann dabei alles sein: ein int, ein float, ein const char *. Eigentlich eine sehr praktische sache mit der man sich ne menge geschachtelte if-else ersparen kann.

          Wenn sie denn mal ordentlich funktionieren würden ;-)

          Marc

  2. Antwort von nach einer Stunde 0 hilfreich
    Re: C++ Biblithek in C Programm: keine Exceptions

    Hi,

    wenn eine Exception nicht abgefangen wird, ist ABRT schon das richtige Verhalten. Vielleicht handelt es sich um ein Problem, das nicht von der Lib selbst behandelt werden kann. Fang doch die Exceptions einfach selbst - das ist eleganter, als das SIGABRT zu fangen, ausserdem kriegst Du da noch Infos in der Exception.

    Gruss

    Thorsten

    • Antwort von nach einer Stunde 0 hilfreich
      Re: C++ Biblithek in C Programm: keine Exceptions

      Moin, Fang doch die Exceptions einfach selbst
      Das geht? Hast Du mal ein Stichwort/Manpage?

      Thorsten

      • Antwort von nach 2 Stunden 0 hilfreich
        Re^2: C++ Biblithek in C Programm: keine Exception

        Hi, Fang doch die Exceptions einfach selbst
        Das geht? Hast Du mal ein Stichwort/Manpage?
        Ja, das ist der Sinn von Exceptions, man kann Fehler leicht abfangen, wenn man das aber nicht tut wird das Programm bendet (was ja bei unbehandelten Fehlern durchaus sinnvoll ist).
        Eine Exception ist ein Objekt. In der STL (Standard Template Library, die C++ standard Bibliothek) sind alle Exceptions vom Typ exception abgeleitet (vererbt). Ich leite alle meine Exceptions ebenfalls von diesem Typ und ich schaetze jeder vernuenftige Programmierer tut das. Daher solltest Du den Typ auf jeden Fall abfangen. Beispiel:

        int main() {
        try {
        f(i);
        } catch(exception e) {
        cout << "Caught an exception. It says: " << e.what() << endl;
        } catch(...) {
        cout << "Unknown exception caught" << endl;
        }
        }

        try {...} fuehrt Deinen Code aus. Wenn dieser Code eine Exception wirft, wird geschaut, ob der Typ der Exception zu einem der Catch-clauses passt. Wenn die Exception vom Typ exception abgeleitet ist, wird der Code im ersten catch-Scope ausgefuehrt. what() ist eine Methode (member-function) von exception, die const char* zurueck gibt (also einen C-String, der Informationen ueber den Fehler enthaelt). Wenn Du die tatsaechlichen Typen abfaengst, kannst Du statt eine Ausgabe zu machen den Fehler auch behandeln.
        Der zweite Catch-Scope faengt jede beliebige Exception ab (mit ...). Daher kann er aber auch mangels Informationen den Fehler kaum behandeln.
        Exceptions koennen ueberall behandelt, nicht nur in der main(). Meiner Ansicht nach sollte allerdings alles in mein in einem try{} stehen, dann hat man schon mal alle exceptions abgefangen und kann eine ordentlich Ausgabe machen bevor man abbricht. Weiter unten im Code koennen dann zusaetzlich spezifischere Fehlerbehandlungen stattfinden, wenn gewuenscht.
        Dazu muss die main natuerlich als C++ compiliert werden, das sollte aber kein Problem sein, wenn Du eh schon C/C++ mischst.
        So eine einfache Referenz habe ich nicht, Exceptionhandling ist aber z.B. im zweiten Band von "Thinking in C++" von Bruce Eckel sehr gut erklaert. Das Buch kannst Du kostenlos unter http://www.mindview.net/ downloaden.

        Gruss

        Thorsten

        • Antwort von nach 3 Stunden 0 hilfreich
          Re: C++ Biblithek in C Programm: keine Exception

          Moin,

          Das war jetzt ein Mißverständnis: Das Prinzip von try/catch kenne ich, ich wollte wissen, ob man die Exceptions in C fangen kann. Denn so hatte ich die Problembeschreibung verstanden. Gruss

          Thorsten

          • Antwort von nach 7 Stunden 0 hilfreich
            Re^2: C++ Biblithek in C Programm: keine Exception

            Nabend!

            Ich glaube, wir sind alle ein bisschen daneben heute ;-)

            Also try-catch funktioniert in C nicht. Und diese Art von Excpetion kann man meines Wissens nach auch nicht fangen.

            Aber das ist auch nicht mein Problem.

            Ich habe ein in C geschriebenes Hauptprogramm, das ich nicht geschrieben habe und auch nicht direkt ändern kann. Dieses bietet allerdings die Möglichkeit zur laufzeit Module in Form von dynamisch gelinkten Bibliotheken hinzuzuladen. Diese Bibliothek ist bis auf einige winige feste Schnittstellen-Funktion die als extern "C" deklariert sind vollständig in C++ geschieben. Diese Bibliothek benutzt C++ Exceptions zur Fehlerbehandlung, d.h. sie wirft zum einen wild mit Exceptions um sich, sie besitzt aber auch gleichzeitig eine übergeordnete Handler-Funktion, welche ALLE evtl. auftretende Exceptions behandeln soll, damit das in C geschriebene Hauptprogramm damit nichts zu tun hat.

            Leider funktioniert diese strikte Trennung offenbar nicht richtig, d.h. nicht alle für das Exception-Handling relevanten Teile liegen werden mit in die Bibliothek gepakt bzw. die entsprechden Initialisierungs-Routinen in der Bibliothek werden beim Laden durch das Hauptprogramm nicht korrekt ausgeführt.

            Gruss, Marc Moin,

            Das war jetzt ein Mißverständnis: Das Prinzip von try/catch
            kenne ich, ich wollte wissen, ob man die Exceptions in
            C fangen kann. Denn so hatte ich die
            Problembeschreibung verstanden.



Keine passende Antwort gefunden? Jetzt eigene Frage stellen!