Exceptions global abfangen?



  • Hallo,

    ich habe folgendes Problem:
    Ich habe mehrere Methoden welche Exceptions werfen können, was ich so implementiert habe:

    throw "KlassenName::MethodenName() - Fehlerbeschreibung";
    

    Jetzt möchte ich gerne all diese Exceptions global abfangen, ich will also nur einen catch Block haben welcher all diese Meldungen abfängt und ausgibt.
    Gibt es eine solche Möglichkeit? Wenn nein, gibt es die Möglichkeit die entsprechenden bereits implementierten Exceptions zu verwenden?

    Danke schonmal,

    Max



  • Du kannst in einer VCL-Anwendung Exceptions zentral abfangen; wie das geht, habe ich hier dargelegt.

    Allerdings machst du es dir wesentlich einfacher, wenn du gewöhnliche Exception-Klassen (z.B. std::runtime_error, System::Exception oder noch besser: eine selbst geschriebene Klasse, die von einem dieser Typen ableitet) wirfst und nicht Stringliterale.



  • Hi,

    vielen Dank, das mit den STL Exceptions war ein Super Tipp, ich kenne mich leider auf dem Gebiet noch nicht so gut aus :(.

    Ich habe mir jetzt sowas gebastelt:

    #ifndef _PSAException_
    #define _PSAException_
    
    #include <exception>
    #include <string>
    
    class PSAException : public std::exception
    {
    	private:
    	std::string message;
    
    	public:
    	PSAException(std::string newMessage)
        {
    		message = newMessage;
    	}
    
    	PSAException(const char *newMessage)
    	{
        	message = newMessage;
    	}
    
    	virtual const char* what() const throw()
    	{
        	return message.c_str();
        }
    };
    
    #endif
    

    Funktioniert auch wunderbar soweit, die Frage wäre nur: habe ich irgendwas wichtiges vergessen?

    Punkt zwei ist, eigentlich wollte ich in meiner

    _tWinMain(...)
    

    Funktion alle Exceptions abfangen, allerdings wird dann das Programm auch immer zwangsweise beendet. Im Moment fange ich also mit vier try / catch Blöcken Exceptions ab (alle in einer "Steuerungs"-Klasse).
    Gibt es hier eine Alternative zwischen "einen Haufen try / catch Blöcke verwenden" und "Programm beenden"?

    Gruss,

    Max



  • Den Konstruktor mit dem const char * kannst du dir sparen. std::string besitzt ja eine Konstruktor dafür, so dass der string-Konstruktor auch damit zurecht kommt.
    Wenn du statt von std::exception von einer der schon bestehenden abgeleiteten Klassen ableitest, kannst du alles etwas vereinfachen. z.Bsp. so:

    class PSAException : public std::logic_error
    {
       public:
    	   PSAException( const std::string& s) : std::logic_error(s) {}
    };
    


  • Danke für den Tipp!
    Ich habe aber auch noch eine allgemeine Frage zu dem Code der exception Klasse:

    virtual const char* what() const throw();
    

    Was genau macht dieses Konstrukt? Also, das angehängt "const throw()"?



  • Das const besagt, dass dies eine konstante Memberfunktion ist. D.h. Diese Funktion wird für konstante Instanzen der Exceptionklasse verwendet.
    http://tutorial.schornboeck.net/constmethode.htm
    Das throw() ist eine sogenannte Exceptionspezifikation, die in diesem Fall besagt, dass diese Memberfunktion keine Exceptions werfen darf.
    http://tutorial.schornboeck.net/exception_spec.htm



  • Ok, die const Methode ist klar, zu der Exceptionspezifikation habe ich noch eine Frage: ist das ein spezielles Konstrukt welches ausschließlich bei exceptions auftaucht oder kann ich etwas in der Art auch selber implementieren?
    Wenn ja, wie?

    Gruss & Danke,

    Max



  • blub² schrieb:

    Gibt es hier eine Alternative zwischen "einen Haufen try / catch Blöcke verwenden" und "Programm beenden"?

    Hast du die von mir verlinkte Seite nicht gelesen?



  • Hey,

    doch die hab ich gelesen. Ich hätte wohl dazu sagen sollen das ich eher auf der Suche nach etwas Standard konformem bin, etwas was ich theoretisch auch ohne Borland verwenden kann.
    Allerdings, nachdem ich nochmals etwas drüber nachgedacht habe, die Lösung die ich im Moment habe (mehrere try / catch Blöcke) ist für mich wohl momentan sowieso am sinnvollsten.

    Danke euch allen,

    Max



  • Alles Wissenswerte, das man über Exception Specifications wissen muss:
    Definiere keine Exception Specifications!

    Die Gründe führt Herb Sutter in einem Guru of the week article hier auf:
    [A pragmatic look at exception specification


Anmelden zum Antworten