由于X或Y的原因,为了避免异常,人们在c ++中使用了哪些错误处理方案?我已经实施了自己的策略,但我想知道其他人提出了什么,并就每种方法的优缺点进行讨论
现在,为了解释我在特定项目中使用的方案,可以这样总结。通常需要抛出的方法,实现如下的接口:
bool methodName( ...parameters.... , ErrorStack& errStack)
{
if (someError) { errStack.frames.push_back( ErrorFrame( ErrorType , ErrorSource ) );
return false;
}
... normal processing ...
return true;
}
简而言之,返回参数表示处理是否正常或是否发生错误。错误堆栈基本上是一个错误帧的std :: vector,其中包含有关错误的详细信息:
enum ErrorCondition {
OK,
StackOverflowInminent,
IndexOutOfBounds,
OutOfMemory
};
struct ErrorFrame {
ErrorCondition condition;
std::string source;
ErrorFrame( ErrorCondition cnd , const char* src ) : condition(cnd) , source(src) {}
inline bool isOK() const {
return OK == condition;
}
};
struct ErrorStack {
std::vector< ErrorFrame > frames;
void clear() {
frames.clear();
}
};
这种方法的优点是类似于Java异常提供的详细错误堆栈,但没有异常的运行时开销。主要的缺点是(除了非标准性,我仍然必须以某种方式处理来自第三方代码的异常并转换为ErrorCondition),因为源库的多个组件需要,所以很难保留ErrorCondition枚举。不同的错误,所以这个策略的第二个版本可以使用某种类型的继承层次结构来处理errorConditions,但我仍然对实现它的最佳方法没有信心