我有一个看起来像这样的设置。抛出异常是一种健康的退出方式吗?
class Checker
{ // member data
Results m_results; // see below
public:
bool Check();
private:
bool Check1();
bool Check2();
// .. so on
};
检查器是一个为工程分析执行冗长检查计算的类。每种类型的支票都有检查员存储的双倍结果。 (见下文)
bool Checker::Check()
{ // initilisations etc.
Check1();
Check2();
// ... so on
}
一个典型的检查功能应该是这样的:
bool Checker::Check1()
{ double result;
// lots of code
m_results.SetCheck1Result(result);
}
而且结果类看起来是这样的:
class Results
{ double m_check1Result;
double m_check2Result;
// ...
public:
void SetCheck1Result(double d);
double GetOverallResult()
{ return max(m_check1Result, m_check2Result, ...); }
};
注:所有代码过于简单。
检查器和结果类最初编写来执行所有检查并返回整体双重结果。现在有一个新的要求,我只需要知道的任何的结果是否超过1.如果是,则不需要执行后续检查(这是优化)。要做到这一点,我可以:
- 修改每个CheckN函数以保持检查结果和返回。父Check函数将继续检查m_results。 OR
- 在Results :: SetCheckNResults()中,如果值超过1,则引发异常,并在Checker :: Check()结束时捕获它。
首先是繁琐,容易出错,次优的,因为每一个功能CheckN进一步分支出来成子支票等
第二是非侵入和快捷。一个缺点是我能想到的是,Checker代码可能不一定是异常安全的(尽管其他地方没有引发其他异常)。还有什么是我忽略的显而易见的东西?抛出异常和堆栈展开的成本是多少?
有更好的第三种选择吗?
是否有一个速度/资源需求?看起来如此,但你并没有完全清楚。 – Carlos 2010-05-20 08:28:52
卡洛斯,是的,有一个速度要求。我试图实现的新模式只需要知道结果是否超过1,并且必须尽快返回ASAP。 – ramaseshan 2010-05-20 08:47:13