Какие схемы обработки ошибок люди используют в c ++, когда необходимо, по причинам X или Y, избегать исключений?Я реализовал свою собственную стратегию, но я хочу знать, что придумали другие люди, и обсудить тему преимуществ и недостатков каждого подхода
Теперь, чтобы объяснить схему, которую я используюпо конкретному проекту его можно подытожить следующим образом.Методы, которые обычно требуют выброса, реализуют интерфейс, такой как:
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, но я все еще не уверен в наилучшем способе ее достижения