从 std: : Exception 继承的正确方法

我刚刚创建了异常层次结构,并希望将 char*传递给我的一个派生类的构造函数,并提供一条消息告诉它出了什么问题,但显然 std::exception没有允许我这样做的构造函数。然而,有一个称为 what()的类成员建议可以传递一些信息。
我怎么能(可以吗?) 将文本传递给 std::exception的派生类,以便用异常类传递信息,因此我可以在代码中说:

throw My_Exception("Something bad happened.");
93644 次浏览

如果希望使用字符串构造函数,应该从实现字符串构造函数并实现 std: : eption: : what 方法的 运行时错误Logic _ error继承。

接下来就是从新继承的类中调用 run _ error/logic _ error 构造函数,或者如果使用 c + + 11,可以使用构造函数继承。

what方法是虚方法,其含义是您应该重写它,以返回您想要返回的任何消息。

这样吧:

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

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

我使用下面的类处理我的异常,它工作得很好:

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() noexcept {}


/** 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 noexcept {
return msg_.c_str();
}


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

如果您的目标是创建一个异常,这样您就不会抛出一个通用异常(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 的具体实现,它提供了比 给你更多的构造函数。

为了避免这种情况,您可以使用头 <stdexcept>中预定义的任何方便类。看看这些“ 异常类别”的灵感。

这里有一个例子

 class CommunicationError: public std::exception {
public:
explicit CommunicationError(const char* message) : msg(message) {}
CommunicationError(CommunicationError const&) noexcept = default;


CommunicationError& operator=(CommunicationError const&) noexcept = default;
~CommunicationError() override = default;


const char* what() const noexcept override { return msg; }
private:
const char* msg;
};

[1] https://www.autosar.org/fileadmin/user_upload/standards/adaptive/17-03/AUTOSAR_RS_CPP14Guidelines.pdf