如何捕获所有类型的堆栈错误?

时间:2016-04-21 08:13:16

标签: c++ exception

我正在尝试使用此程序的try-catch,正如您在main中看到的那样,但是,我只能单独捕获错误,例如在这里我只能捕获char:

catch (stack<char>::Empty)

但是,我想捕获所有类型的错误,双重,字符串等...我该怎么做?

#include <iostream>
using namespace std;


template <class T>
class stack{
    T *s;
    int size;
    int top;
public:
    //neww
    class Full{};
    class Empty{};
    //neww
    stack(int sz)
    {
        size=sz;
        s = new T[sz];
        top=-1;
    }
    void push(T e);

    T pop()
    {

        if (top<0)
            throw Empty();

        return s[top--];
    }
};
template <class T>
void stack<T>::push(T e)
    {
        if (top>=size)
            throw Full();
        s[++top]=e;
    }
int main()
{
    stack<char> s(5);

    try {
        s.pop();
        s.push('a');
        s.push('b');
        cout<<s.pop()<<endl;
        stack<double> s1(10);
        s1.push(3.2);
        s1.push(0.5);
        cout<<s1.pop()<<endl;

    }

    catch (stack<char>::Full ) {
        cout <<"Stack is full!"<<endl;
        return 1;
    }

    catch (stack<char>::Empty) {

        cout <<"Stack is empty!"<<endl;
        return 1;
    }
    return 0;
}

我不能做catch(...)因为我需要处理两种类型的异常,full和empty。

1 个答案:

答案 0 :(得分:3)

您可以从一个通用的,未模板化的基类派生您的异常类,并通过引用来捕获:

struct Stack_Full { };
struct Stack_Empty { };

template <class T>
class stack{
    ...
    class Full : public Stack_Full {};
    class Empty : public Stack_Empty {};
    ...
};

...
    catch (const Stack_Full&) {

如果您不希望只为某些stack<T>::XYZ / T抓取XYZ,则可以直接throw未模板化的类型。您可能想要也可能不想创建一个专用的非模板化类或命名空间来保存它是类似的支持代码。