2016-07-15 55 views
3

当谈到C++ std:异常处理时,我非常担心。以下是我在网上找到的一些示例代码,我目前使用它。自动添加前缀到自定义异常

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; 
}; 

现在,我想要做的就是自动预先安排下列方案引发的每个异常。

一些代码中引发了以下配置的MyDerivedException例外: “original_exception_message”

当MyDerivedException收到 “original_exception_message”,我想用加前缀: “派生发生异常:”

当MyBaseException异常收到MyDerivedException异常时,我想在它前面加上: “异常提升:”

这样最终的消息看起来像这样:

“基地发生异常:衍生发生异常:original_exception_message”

我得感觉,我会得到各种关于这个讨厌的回复,不好的观念和陋习的......但我不自称是一位专家。

请注意,prepend消息实际上并非如此。他们会更有信息。

在此先感谢。

+1

“我得感觉我会就在这种种讨厌的答复,不好的观念和陋习”你知道这个C++社区太清楚了:-) 。好的问题,但是,得到很好的回应! – AndyG

+2

我错过了什么,或者你是否声明了两次相同的构造函数? ('const char * message') – lcs

+0

你有重复的构造函数 - 上面的代码将无法编译。 –

回答

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; 
} 

阅读该链接http://en.cppreference.com/w/cpp/error/exception

+0

谢谢mooncheese。我一直在玩类似的方法。但是我的版本仍然保留:m_Base(消息)部分......这不会给我预期的结果(主要是因为我不知道我在做什么)。但我现在明白了一点。如果没有其他人提出这样的问题(如今天),我会标记为答案。再次感谢。 – ThermoX