Fehlerbehandlung Rapidxml



  • Hallo
    Ich habe das Problem, dass mein Programm immer "Unterbrochen" wird wenn es einen Fehler beim Auslesen der config.xml gibt. Ich verwende rapidxml und wenn ich zB. fälschlicherweise auf ein Attribut zugreifen will, welches es in der Config gar nicht gibt unterbricht das Programm mit einer "Zugriffsverletzten für Speicherbereich...." . Kann ich solche Fehler irgendwie abfangen und auf dem Bildschirm ausgeben oder geht das nicht weil rapidxml das halt so macht.

    Vielen Dank für eure Antworten
    Gruß Zaus



  • Sollte die Ursache wirklich in rapidxml liegen solltest du dringends deine XML-Lib wechseln. Da dieses Teil jedoch nicht ganz neu ist, glaube ich nicht das man einen solch elementaren Fehler übsehn hat, daher nehme ich an das das Problem wahrscheinlich bei deiner Anwendung liegt.



  • Kann natürlich gut sein, dass das irgendwie an meiner Anwendung liegt. Beim Debuggen tritt der Fehler allerdings immer in der "rapidxml.h" auf wenn dort dann nach dem (nicht vorhandenen) element gesucht wird...



  • Wird vielleicht eine Exception geworfen, die du nicht fängst? Sowas müsste in der Dokumentation stehen.



  • Danke, das scheint tatsächlich der Fehler zu sein.
    Nun könnte ich allerdings noch ein wenig Hilfe gebrauchen. Also ich fang die Exceptions doch indem ich um den Block in dem die rapidxml anweisungen stehe einen try-Block packe und danach mit catch die exceptions auffange. Wenn ich das jetzt mache kommt der Fehler nicht mehr in der rapidxml Datei sondern bei

    sscanf(attribut->value(), "%d", &j);
    

    obwohl auch das im try-Block steht.
    Ich kann ja glaube ich unterschiedliche Fehler in unterschiedlichen catch Blpcken auffangen. Wie weiss ich was für einen typ Fehler das jeweils ist den ich da auffangen müsste?

    Gruß Zaus



  • Hmm, sscanf ist C und C kennt keine Exceptions. sscanf mag keine Nullpointer und steigt dann mit segfault aus, deswegen musst du vorher prüfen, was du übergibst.
    Disclaimer: ich kenne rapidxml nicht, das basiert also nur auf Vermutungen

    Mischen von C und C++ ist sowieso schlecht. Warum machst du das nicht mit einem stringstream, oder mit boost::lexical_cast ?



  • Hey
    Also sscannf war einfach die einzigste Methode mit der ich es geschafft habe eine integer Zahl aus dem Attribut auszulesen 😞





  • Hey danke, das ist zwar genau anders herum wie ich es gebraucht habe aber hab es mit stingstream hinbekommen, war wirklich ganz simpel. Allerdings ändert das nichts daran, dass ich die Exception immer noch nicht abfangen kann. Kommt jetzt doch wieder in rapidxml.h nur an einer anderen Stelle als ohne die try und catch blöcke.


Anmelden zum Antworten