正确的继承std :: exception的方法

时间:2011-11-16 13:51:17

标签: c++ exception

我刚刚创建了异常层次结构,并希望将char*传递给我的一个派生类的构造函数,并显示一条消息,告诉我哪里错了,但显然std::exception没有构造函数可以让我这样做。然而,有一个名为what()的集体成员会建议传递一些信息 我怎么能(我可以?)将文本传递给std::exception的派生类,以便通过我的异常类传递信息,所以我可以在代码中的某处说:

throw My_Exception("Something bad happened.");

5 个答案:

答案 0 :(得分:57)

我使用以下类来处理异常,它可以正常工作:

class Exception: public std::exception
{
public:
    /** Constructor (C strings).
     *  @param message C-style string error message.
     *                 The string contents are copied upon construction.
     *                 Hence, responsibility for deleting the char* lies
     *                 with the caller. 
     */
    explicit Exception(const char* message):
      msg_(message)
      {
      }

    /** Constructor (C++ STL strings).
     *  @param message The error message.
     */
    explicit Exception(const std::string& message):
      msg_(message)
      {}

    /** Destructor.
     * Virtual to allow for subclassing.
     */
    virtual ~Exception() throw (){}

    /** Returns a pointer to the (constant) error description.
     *  @return A pointer to a const char*. The underlying memory
     *          is in posession of the Exception object. Callers must
     *          not attempt to free the memory.
     */
    virtual const char* what() const throw (){
       return msg_.c_str();
    }

protected:
    /** Error message.
     */
    std::string msg_;
};

答案 1 :(得分:51)

如果你想使用字符串构造函数,你应该继承std::runtime_errorstd::logic_error ,它实现了一个字符串构造函数,并实现了std :: exception :: what方法。

然后它只是从你的新继承类调用runtime_error / logic_error构造函数的情况,或者如果你使用c ++ 11,你可以使用构造函数继承。

答案 2 :(得分:7)

这个怎么样:

class My_Exception : public std::exception
{
public:
virtual char const * what() const { return "Something bad happend."; }
};

或者,如果你愿意,创建一个接受描述的构造函数......

答案 3 :(得分:5)

what方法是虚拟的,意思是你应该覆盖它以返回你想要返回的任何消息。

答案 4 :(得分:5)

如果您的目标是创建一个异常以免引发一般性异常(cpp:S112),则可能只想使用using声明公开从(C++11)继承的异常。

这是一个最小的例子:

#include <exception>
#include <iostream>

struct myException : std::exception
{
    using std::exception::exception;
};

int main(int, char*[])
{
    try
    {
        throw myException{ "Something Happened" };
    }
    catch (myException &e)
    {
        std::cout << e.what() << std::endl;
    }
    return{ 0 };
}

正如Kilian在评论部分中指出的,该示例取决于std :: exception的特定实现,该实现提供比here所提及的更多的构造函数。

为了避免这种情况,您可以使用标头<stdexcept>中预定义的任何便利类。请参阅这些“ Exception categories”以获取灵感。