Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Stacktrace in C++?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.09.2003, 11:43 Uhr
~(un)wissender
Gast


Alle die schon mal mit Java-Exception zu tun gehabt haben wissen was ich meine.
Gibt es das auch in C++?
Oder muss man sich das selbst zusammenbauen, indem man in allen Funktionen fängt und wieder wirft (und was in die Exception schreibt).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.09.2003, 12:03 Uhr
virtual
Sexiest Bit alive
(Operator)


Hey, wir sind in der Welt der harten Jungs und Mädels! So nen java schnickSchnack gibts nicht in C++. Hier wird noch so nah am bit debuggt, daß man es togglen sehen kann.

Es ist übrigens nur eine begrenzt gute Idee, eine Exception immer zu fangen, um sie dann wieder zu werfen, nur im einen Stacktrace zu bekommen.
Du kannst aber solche sachen machen (um herauszubekommen, wo im Source denn die Exception herkam):

C++:
#include <iostream>
#include <stdexcept>
#include <sstream>

class SourceLocation
{
private:
    const char* m_szFilename;
    unsigned m_nLine;
public:
    SourceLocation(const char* filename, unsigned line)
        :m_szFilename(filename), m_nLine(line) { }

    std::string toString() const
    {
        std::stringstream strmLoc;
        strmLoc<<m_szFilename<<':'<<m_nLine;
        return strmLoc.str();
    }
};


class exception_withinfo: public std::runtime_error
{
public:
    exception_withinfo(const char* msg, const SourceLocation& loc)
        :std::runtime_error(msg+std::string(" at ")+loc.toString())
    {
    }
};


void f()
{
    throw exception_withinfo("Fehler!", SourceLocation(__FILE__, __LINE__));
}


int main()
{
    try
    {
        f();
    }
    catch(std::exception& ex)
    {
        std::cerr<<ex.what()<<std::endl;
    }
}


Das ist jetzt nur so grob skizziert: wesentlich sind eben __FILE__ und __LINE__, die vom Präprozessor ausgewertet werden. Mit ein wenig Arbeit kann man da sicherlich was draus bastel, aber man kommt eben nicht um die vielgeschmähten Macros herum;
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.09.2003, 12:11 Uhr
~(un)wissender
Gast


Ja, so ungefähr habe ich mir das auch vorgestellt, das Problem ist hierbei nur, das man zwar den genauen Orc (nee Ort meine ich) bekommt, aber halt nicht den Trace, d.h. wer die Aufrufer waren.
Ich glaube, da kommt man nicht ums permanente fangen und werfen herum, ist aber natürlich sehr performancelastig!

Übrigens ist Java gar nicht so verkehrt, da kann man sich nämlich darauf verlassen, dass die Sprache alles für einen macht, man muss nur noch programmieren.
In C++ muss man den Compiler, den Standard, den Linker, syntaktische Doppeldeutigkeiten, etc. beachten.
Naja, lerne trotzdem C++, warum nur?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: