2016-07-15 15 views
3

Ich bin ziemlich unsicher, wenn es um C++ std: Ausnahmebehandlung geht. Hier ist ein Beispielcode, den ich im Internet gefunden habe, den ich derzeit verwende.Automatisch Präfix zu benutzerdefinierten Ausnahme hinzufügen

class MyBaseException : public std::exception 
{ 
    public: 

    explicit MyBaseException(const std::string & message) 
    : m_Base(message.c_cstr()) {} 

    explicit MyBaseException(const char *message) 
    : m_Base(message) {} 

    virtual ~MyBaseException() throw() {} 

protected: 
    typedef std::exception m_Base; 
}; 

class MyDerivedException : public MyBaseException 
{ 
    public: 

    explicit MyDerivedException (const std::string & message) 
    : m_Base(message.c_cstr()) {} 

    explicit MyDerivedException (const char *message) 
    : m_Base(message) {} 

    virtual ~MyDerivedException() throw() {} 

protected: 
    typedef MyBaseException m_Base; 
}; 

Nun, was ich möchte ist zu tun, um automatisch prepend mit dem folgenden Schema alle Ausnahmen angehoben.

Einige Code wirft eine MyDerivedException Ausnahme mit dem folgenden: "original_exception_message"

Wenn die MyDerivedException empfängt "original_exception_message", ich möchte es vorangestellt mit: "Abgeleitet Ausnahme ausgelöst:"

und wenn MyBaseException die MyDerivedException Ausnahme empfängt, würde Ich mag es vorangestellt mit: „Basis-Exception ausgelöst:“

Derart, dass die letzte Botschaft würde wie folgt aussehen:

„Basis-Exception ausgelöst: Abgeleitet Ausnahme ausgelöst: original_exception_message“

Ich muss das Gefühl ich alle möglichen bösen Antworten auf diese, über schlechte Konzepte und schlechte Praktiken bekommen werde ... Aber ich weiß nicht behaupten, ein Experte zu sein.

Beachten Sie, dass die Prepend-Nachrichten nicht das sind. Sie wären ein wenig informativer.

Vielen Dank im Voraus.

+1

„Ich muss das Gefühl, ich werde alle möglichen bösen Antworten auf diese bekommen, über schlechte Konzepte und schlechte Praktiken“ Sie wissen, dass diese C++ Gemeinschaft zu gut :-) . Gute Fragen bekommen jedoch gute Antworten! – AndyG

+2

Fehle ich etwas oder deklarierst du den gleichen Konstruktor zweimal? ('const char * message') – lcs

+0

Sie haben doppelte Konstruktoren - der obige Code kann nicht kompiliert werden. –

Antwort

1
#include <iostream> 
#include <exception> 

class MyBaseException : public std::exception 
{ 
public:  
    explicit MyBaseException(const std::string & message) 
    : m_message("Base Exception Raised: " + message) {} 

    virtual const char* what() const throw() 
    { 
     return m_message.c_str(); 
    } 

private: 
    const std::string m_message; 
}; 

class MyDerivedException : public MyBaseException 
{ 
public: 

    explicit MyDerivedException (const std::string& message) 
    : MyBaseException("Derived Exception Raised: " + message) {} 

}; 

int main() 
{ 
    try 
    { 
     throw MyDerivedException("derived"); 
    } 
    catch(std::exception const& e) 
    { 
     std::cout << e.what(); 
    } 
    return 0; 
} 

Und lesen Sie diesen Link http://en.cppreference.com/w/cpp/error/exception

+0

Danke mooncheese. Ich hatte mit einer ähnlichen Herangehensweise gespielt. Aber meine Version behielt immer noch den: m_Base (Nachricht) -Teil ... was mir nicht die erwarteten Ergebnisse brachte (meistens weil ich nicht weiß, was zum Teufel ich mache). Aber ich verstehe jetzt ein bisschen besser. Ich werde Sie als die Antwort markieren, wenn niemand anderes (wie heute) ein Problem mit diesem Ansatz aufwirft. Danke noch einmal. – ThermoX