Обработка исключений в классе C

#c

#c

Вопрос:

Я изучаю структуры данных и алгоритмы на C , и в настоящее время я сталкиваюсь с проблемой. Я пишу класс стека с использованием массивов, и в книге предлагается использовать спецификацию исключения в объявлении функции. В моем случае у меня есть классы StackEmptyException и StackFullException, производные от класса RuntimeException, и в книге говорится, что я не должен пытаться перехватить это исключение в теле функции, но всякий раз, когда я пытаюсь запустить свою программу, вызывающую исключение, она не начинает говорить «Необработанное исключение». Я хотел бы понять, откуда возникает проблема, потому что в книге это на самом деле не объясняется, только упоминается, поэтому я был бы признателен за любой связанный ответ. Вот мой код:

 class RuntimeException {
private:
    string errMsg;
public:
    RuntimeException(const stringamp; err) { errMsg = err; }
    string getMessage() const { return errMsg; }
};

inline ostreamamp; operator<<(ostreamamp; out, const RuntimeExceptionamp; e){
    return out << e.getMessage();
}

class StackEmptyException : public RuntimeException {
public:
    StackEmptyException(const stringamp; err) : RuntimeException(err) {}
};

class StackFullException : public RuntimeException {
public:
    StackFullException(const stringamp; err) : RuntimeException(err) {}
};

template <typename Object>
class ArrayStack {
private:
    enum { CAPACITY = 1000 };
    int capacity;
    Object* S;
    int t;

public:
    ArrayStack(int cap = CAPACITY) {
        capacity = cap;
        S = new Object[capacity];
        t = -1;
    }

    int size() const { return t   1; }
    bool isEmpty() const { return (t < 0); }

    // Passing the object by reference so that we could
    // edit its value    e.g. stack.top() = 10; would be valid
    Objectamp; top() throw(StackEmptyException) { 
        if (isEmpty())
            throw StackEmptyException("Access to empty stack");
        return S[t];
    }

    void push(const Objectamp; elem) throw(StackFullException) {
        if (size() == capacity)
            throw StackFullException("Stack overflow");
        S[  t] = elem;
    }

    // Not passing by reference, because we remove the last element
    // from the stack, thus we can not change its value 
    Object pop() throw(StackEmptyException) {
        if (isEmpty())
            throw StackEmptyException("Access to empty stack");
        return S[t--];
    }

    ArrayStack(const ArrayStackamp; st);               // Copy constructor
    ArrayStackamp; operator=(const ArrayStackamp; st);    // Assignment operator constructor
    ~ArrayStack() { delete[] S; }                   // Destructor

};
 

Комментарии:

1. Итак, как вы используете этот класс? И где вы пытаетесь поймать исключение?

2. Просто попробовал несколько сценариев в функции main, и все работает хорошо, пока я не попытаюсь принудительно вызвать исключение, например, если я начну с stack.pop(); в только что объявленном стеке.

3. Ну, если вы не переносите вызов функции, которая может генерировать исключение в a try catch block, тогда исключение не обрабатывается. Если я правильно понял, что сказано в книге (я не читал саму книгу, просто следуя вашему заявлению), то вам следует либо перенести вызовы функций-членов ArrayStack класса в try catch или всю программу (что на самом деле не было бы лучшей практикой, поскольку это затруднило бывыясните, где именно возникает исключение)

4. Завернул это в тела функций, и теперь все в порядке. Я чувствую себя глупо: D Спасибо!

Ответ №1:

Я думаю, что причина, по которой в вашей книге говорится, что вы не должны всегда использовать try / catch, чтобы поймать это, заключается в том, что вы должны сначала выполнить проверку границ самостоятельно. Поэтому, прежде чем использовать pop(), сначала проверьте, является ли isEmpty(), например.