我们有一个很大的代码库,有很多代码可以做这种事情:
bool DoSomething(CString Value)
{
if(Value == "bad")
{
AfxMessageBox("description of error");
return false;
}
return true;
}
甚至只是这个:
bool DoSomething(CString Value)
{
if(Value == "bad")
{
return false;
}
return true;
}
我们考虑了各种替代方案:
所以我想知道我们是否可以创建一组类,如下所示:
class CResult
{
protected:
CResult()
{
// Don't have to initialize because the derived class will do it
}
public:
operator bool() { return m_Result; };
bool m_Result;
CString m_Message;
};
class CSuccess : public CResult
{
public:
CSuccess()
{
m_Result = true;
}
};
class CFailure : public CResult
{
public:
CFailure(const CString & Message)
{
m_Result = false;
m_Message = Message;
}
};
然后上面的代码看起来像这样:
CResult DoSomething(CString Value)
{
if(Value == "bad")
{
return CFailure("description of error");
}
return CSuccess();
}
我喜欢它:
我看到的主要缺点是成功的开销更高,因为对象和字符串以及bool都将被实例化 - 但在我们的应用程序中,很多时候所讨论的代码对性能不敏感,例如验证用户输入等
我错过了一些其他的大缺点吗?还有更好的解决方案吗?
答案 0 :(得分:3)
将“错误”分为两类非常有用:
致命错误
这些是一种错误,恢复是没有意义的。
void check(bool cond, const string& msg)
{
if (!cond)
{
// eventually log it somewhere
std::cerr << "Fatal: " << msg << std::endl;
exit(1);
}
}
例外错误
这些是您可以从中恢复并使程序保持运行状态的错误。
void check_ex(bool cond, const string& msg)
{
if (!cond)
{
// eventually log it somewhere
throw std::runtime_error(msg);
}
}