#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(), например.