在实施CException c++;班 我尝试了一个简单的C++ cExabor实现类,它来自STD::Exchange。我做错了什么,我应该补充什么,我应该改进什么?一个应该考虑的C++异常是什么?目的是使其尽可能独立于平台。守则如下: 编辑:

在实施CException c++;班 我尝试了一个简单的C++ cExabor实现类,它来自STD::Exchange。我做错了什么,我应该补充什么,我应该改进什么?一个应该考虑的C++异常是什么?目的是使其尽可能独立于平台。守则如下: 编辑:,c++,visual-c++,C++,Visual C++,我已经使用您的指示编辑了我的最终实现。通常您不需要在exception类中实现方法,因此它可能看起来像这样: class YourException : public std::runtime_error { public: explicit YourException(const std::string & msg) : std::runtime_error(msg) { } }; 我不明白为什么要用其他方法 您不应该从它的构造函数中抛出异常。

我已经使用您的指示编辑了我的最终实现。

通常您不需要在exception类中实现方法,因此它可能看起来像这样:

class YourException : public std::runtime_error
{
public:
    explicit YourException(const std::string & msg) :
        std::runtime_error(msg)
    {
    }
};
我不明白为什么要用其他方法

您不应该从它的构造函数中抛出异常。相反,客户端代码应该引发您的异常:

    throw YourException("Some error");

首先,你应该学习更多的C++。如果你想要一个平台无关的异常类,只需使用<代码> STD::异常< /代码>。如果您正在实现自己的,那么(希望如此),因为您需要的不仅仅是平台独立性。但根据您给我们的要求(字面上说,它应该是平台独立的),唯一明智的答案是“只使用
std::exception
”)平台独立从不使用Windows ISM开始,如LPSTR、UINT、PUINT和所有其他大写名称。不存储错误消息,MSVC在这方面是非标准的。您的
callBaseCt()
函数将不会编译(除非某个地方有
使用namespace std;
的函数),即使它编译了,也不会执行您期望的操作。而且,你的投掷构造器很奇怪。只需构造exception对象,让调用方担心抛出异常。最后,如果要将类与MFC一起使用,请不要将其命名为
CException
(或者至少将其放在命名空间中),因为MFC也有
CException
类。请不要使用
#define tstring std::wstring
,而是使用typedef!也就是说,如果您必须支持ASCII字符集,我建议您只需使用
std::wstring
即可。我已尝试模拟MFC CEException,使用它的方法。@firexzanderr-MFC不是跨平台的,因为我必须修改一个使用MFC的项目,使其不再使用MFC,并且我正在尽可能地提供一些类似的数据类型,这些数据类型的功能与项目最初从MFC类获得的功能相同。啊,我以前也有过这样的经历:不得不复制一个设计糟糕的类的行为。你应该在你的问题中这样说,你会得到答案而不是抱怨。@firexzanderr-re:“这就是我试图复制的原因”——我对你表示同情。MFC是一个设计糟糕的库。它的主要目的是使Windows程序在各种Windows版本中更具可移植性。
    throw YourException("Some error");