【发布时间】:2014-04-29 01:21:24
【问题描述】:
我正在研究函数调用的错误测试和报告技术,尤其是在调用多个函数时。作为我的意思的一个例子,为简单起见,每个函数都返回一个布尔值:
success = false;
if (fnOne ())
{
if (fnTwo ())
{
if (fnThree ( ))
{
success = true;
}
else
{
cout << "fnThree failed" <<endl;
}
}
else
{
cout << "fnTwo failed" <<endl;
}
}
else
{
cout << "fnOne failed" <<endl;
}
我发现上面的例子(我到处都可以看到)代码很快变得不可读,尤其是当它调用的代码变成多屏高度时。
目前我在 C++ 中处理这个问题的方式(包括“c”标签,以防有人使用流畅的 C 技术)我在我的对象中存储了一个布尔值和一个字符串。 bool 代表成功/失败,字符串代表失败状态的原因。我调用一个函数,如果函数失败,该函数在内部将对象设置为失败状态并提供基于字符串的原因。我仍然对这种方法不是 100% 满意......但它是迄今为止我所拥有的最好的。外观示例:
void myobj::fnOne (void)
{
if (m_fluxCapacitorProngCount > 3)
{
setState (false, "myobj::fnOne - Flux capacitor has been breeding again");
}
}
void myobj::fnTwo (void)
{
if (m_answerToLifeUniverseAndEverything != 42)
{
setState (false, "myobj::fnTwo - Probability drive enabled?");
}
}
void myobj::setup (void)
{
// Ensure time travel is possible
if (valid())
{
fnOne ();
}
// Ensure the universe has not changed
if (valid())
{
fnTwo ();
}
// Error? show the reason
if (valid() == false)
{
cout << getStateReason () << end;
}
}
其中valid()返回true/false,getStateReason()返回错误发生时函数中提供的字符串。
我喜欢它不需要嵌套条件就可以增长,对我来说我觉得这更具可读性,但我确信存在问题......
处理检测和报告多个函数调用返回条件的最佳[最干净]方法是什么?
【问题讨论】:
-
您忘记了一个变体(第一个变体):
bool r1 = fnOne(), r2 = fnTwo(); r3 = fnThree(); if (r1 && r2 && r3) { /* do something */ } else { /* do something else */ } -
Exceptions 是 C++ 的一个选项,我已经看到它被使用过(不幸的是,大部分情况很糟糕,请省去我的恐怖故事),对于 C(简单而干净)来说不是这样:stackoverflow.com/questions/2891766/…跨度>
标签: c++ error-checking