Как добавить обработку исключений - PullRequest
0 голосов
/ 23 сентября 2019

Привет всем, я хотел бы добавить обработку исключений для пары условий.Скобки не соответствуют друг другу при разборке стека и, если введенное пользователем выражение не начинается и не заканчивается на #.В основном просто ищу указатели и советы по обработке выражений в классе, а main - не решение.

Вот то, о чем я думал, но это явно не правильно.
Это сделано в моем классе infixtopost, и у меня есть классinvalidExp () {} объявлено в моем заголовочном файле.
Другое исключение, которое я пытался обработать при основной проверке строки ввода от пользователя с помощью
if(line[0] != '#' || line[line.length()] != '#') throw "Invalid Expression"
, но оно пропустит эту строку и когдаЯ поместил его в блок try catch, остальной код не мог быть обработан.

while (!op->isEmpty() && op->top() != '(') throw invalidExp();
{
    post.push_back(op->pop());

    if (!op->isEmpty())
    {
        op->pop();
    } //to remove ( from stack
}

main:

try{
    IntoPost *infix = new IntoPost(token.length());
    post = infix->inToPost(token);

    cout << post << "=";

    Evalexp *result = new Evalexp(post.length());
    result->evalExp(post);
    result->print();
}
catch (IntoPost::invalidExp){
    cout << "Exception: Invalid Expression" << endl;
}


1 Ответ

3 голосов
/ 23 сентября 2019

Как я понимаю ваш вопрос, вы хотите объявить некоторые пользовательские типы исключений для чистой обработки ошибок.Это хорошо, и следующий код будет примером того, как это можно сделать.Это всего лишь пример, показывающий, что возможно.

0: Понимание throw

Подробнее о throw можно прочитать здесь .Но в целом можно бросить что угодно.throw 1;, например, сгенерирует int.Ваш пример throw "Invalid Expression" будет выбрасывать const char*.Обычно вы хотите выбросить объект класса, который наследуется от std::exception.

1: Объявите класс для каждого типа исключения, которое вам нужно обработать

Хорошей практикой является позволить им расширятьсяиз std :: исключение.В конструкторе я обычно создаю сообщение об исключении и передаю его конструктору std::exception.Ниже приведены лишь примеры:

class ExceptionA : public std::exception {
  public:
    ExceptionA() : std::exception("Case A occurred!") { }
};

class ExceptionB : public std::exception {
  public:
    static string CreateMessage(int x, int y) {
        // You can create a custom exception message here
    }

    ExceptionB(int x, int y) : std::exception(ExceptionB::CreateMessage(x, y)) {}
};

Как видно из ExceptionB, совершенно нормально добавлять дополнительные данные к вашему исключению.Это поможет вам создать более конкретное сообщение об исключении.

2: Сориентируйте ваш код с помощью try-multicatch

Подробнее об этом можно прочитать здесь Это значит,Вы можете использовать несколько блоков catch для каждого блока try.

void foo() {
    try {
        // Calcultion starts here
        // Now you get unexpected input or something like this and signal it by throwing an exception.
        if(errorCondition) { throw ExceptionA(); }

        // Something else might happen here, so you throw the other type of exception
        // in this example ExceptionB also takes two custom parameters.
        if(otherErrorCondition) { throw ExceptionB(x, y); }
    }
    catch(ExceptionA &e) {
        // Handle an occurence of Exception A
    }
    catch(ExceptionB &e) {
        // Handle an occurence of Exception B
    }
    catch(std::exception &e) {
        // Handle an occurrence of any other exceptions STL-components migth throw for example std::range_error
    }
    catch(...) {
        // Handle the occurrence of any other thrown ... things. This will also catch things like throw 1, but usually you don't need this.
    }
}

Здесь важен порядок блоков catch!

3: наслаждайтесь чистой обработкой исключений!

Надеюсь, это ответит на ваш вопрос!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...