Пользовательская (не исключение) стратегия обработки ошибок в C ++ - PullRequest
3 голосов
/ 11 ноября 2010

Какие схемы обработки ошибок люди используют в 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, но я все еще не уверен в наилучшем способе ее достижения

1 Ответ

3 голосов
/ 11 ноября 2010

проверить http://www.open -std.org / jtc1 / sc22 / wg21 / docs / TR18015.pdf Страница 32 и далее

...