Exception beim Konstruktor



  • Wenn ich das hier so Compiliere

    #ifndef _ADDRESS2_H
    #define _ADDRESS2_H
    #include <string>
    #include <exception>
    
    class AddressException : public std::exception
    {
    public:
    	AddressException(const std::string& errortext)
    	{
    		m_Errortext = errortext;
    	}
    	virtual const char* what() const
    	{
    		return m_Errortext.c_str();
    	}
    private:
    	std::string m_Errortext;
    };
    
    class Address
    {
    public:
    	Address(const std::string& filename) 
    		throw (AddressException);  // <- Das sollte doch funktionieren
    .
    .
    .
    

    kommt eine Warnung:

    f:\work\programming\visualnet\oopdummies\kap07\address2\address2.h(25) : warning C4290: C++ exception specification ignored except to indicate a function is not __declspec(nothrow)

    Was bedeuted das?



  • Du hast keinen Konstruktor in deine klasse definierte AddressException der keine parameter übernimmt.



  • In welcher Klasse soll ich einen Konstruktor definieren, der keine Parameter übernimmt?



  • Besser ist du schreibst keinen neuen konstruktoor sonder einfach

    throw (AddressException("throw will gelernt sein"));
    

    alles klar
    sncr
    mfg



  • Hast du zufällig VC++ 7.1? Weil laut MS wird dieses Sprachfeature nicht unterstützt, also in der Methodensignatur die potentiellen Exceptions anzugeben. MS will dieses Feature nur auf Kundenwunsch implementieren, deshalb das Warning.

    Kann aber sein, das es bei anderen Compilern ebenfalls der Fall ist.



  • Jein, denn wenn ich "throw" hinter die Klassendeklaration einer Funktion schreibe,
    sollte es nur die Exceptions von "AddressException" werfen(In dem Beispiel oben).

    Also sollte der Konstruktor nur Exceptions von "AddressException" werfen.
    Aber es kommt immer die Fehlermeldung.

    (Ich hab das Beispiel aus nem Buch abgetippt, es sollte also Funktionieren, tut es aber nicht)



  • Oh ja ich hab VC7.1
    Danke fuer die Info.



  • Hättest dir die Frage hier auch sparen können, wenn du mal deine MSDN bemüht hättest. Die Warnung kannst du auch abschalten:

    [Compiler Warning (level 3) C4290]

    C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist

    Eine Funktion wurde mit einer Ausnahmespezifikation deklariert, die von Visual C++ zwar akzeptiert, nicht aber implementiert wird. Code, der mit nicht berücksichtigten Ausnahmespezifikationen kompiliert wurde, muss für zukünftige Versionen, die Ausnahmespezifikationen unterstützen, möglicherweise neu kompiliert und verknüpft werden.

    Sie können diese Warnung vermeiden, indem Sie das Pragma warning verwenden:

    #pragma warning( disable : 4290 )



  • Von vielen Experten hört man immer wieder das man auf Ausnahmespezifikationen verzichten soll.



  • Visual C++ ignores exception specifications, and I think it might continue doing it. The reason is that exception specifications are lame in the standard C++. They would only make sense if the compiler could check them--the same way it checks const correctness.


Anmelden zum Antworten