大多数人抱怨异常。然后他们接着抱怨说,如果对象失败,异常是唯一可以进行错误检查的方法,让他们感觉是被强加的。这也许是“最好”的方法,但绝对不是唯一的方法。其中最流行的方法之一是两步构造。
1 2 3 4 5 6
|
class Example
{
Example();
bool Create();
bool bOkay;
};
|
我个人认为这违反直觉。不过没关系,它被应用在我们甚至可能想使用异常的地方,比如公司代码。你经常会遇到这样的问题:“它在其他方面有好处吗?”或者“有没有任何时候我更愿意这样做,而不是一步构造?”。这两个问题的答案我都不知道。“Create”不允许对构造函数初始化列表进行优化,而构造函数本身可以。它总是有基本函数开销,因为调用次数更多。有人可能会争辩说,异常造成的开销大于两步构造函数造成的开销。这是一个有效的论点。在抛出异常时,异常确实非常消耗资源。但是,我相信异常的好处大于成本。我实际上并不知道,我从来没有费心去计算周期或进行基准测试。
我知道,这很棒。但在 C 语言中,经常有宏来包装 API 函数,比如“APICHECK(myAPIFunction(structBlahblahblah));”。这在 SFML 中的 OpenGL 和 C 语言中的其他各个领域都有使用。