C ++自制异常处理失败

时间:2016-02-07 15:32:06

标签: c++ exception exception-handling

我正在学习c ++课程,其中一项任务如下:

他们给了我们一个主程序,我们不得不编写它背后的代码。这是代码:

vector<int> iv(4);

iv[3]=42;

cout << iv[3] << endl; // prints "42"

try {
    cout << iv[1] << endl; // throw exception
} 
catch (vector<int>::Uninitialized&){
  cout << "Uninitialized vector element!" << endl;
}

return 0;

我已经为矢量模板提出了这个代码:

T* data;
unsigned int size;

public:
    class Uninitialized{};
    explicit vector(int size) {
        data = new T[size];
        this -> size = size;
        for (unsigned i = 0; i < size; i++) {
            data[i] = 0;
        }
    }

    ~vector() {
        delete [] data;     
    }

    T& operator[](int index) {
        if (index >= size) {
            abort();
        }
        return data[index];
    }

    friend ostream& operator<< (ostream& o, const T& t) {
        if (t == 0)
            throw Uninitialized();
        else
            return o << t;      
    }

但是,永远不会调用 friend 方法,因此永远不会抛出异常。

2 个答案:

答案 0 :(得分:1)

你在

投掷
iv[3]=42;

因为那时data[3] == 0

请记住,即使在您的作业中,您也可以致电operator[];如果你想要T&进行阅读或写作,它并不关心(甚至不知道)。

你应该首先使用调试器来解决这类问题(并且,通常,代码很简单并且你知道如何使bug出现的问题)。你会发现这一点 - 你立刻就会发现异常并没有被抛到你想象的地方。

答案 1 :(得分:1)

如果您的代码在iv[3] = 0 ... try之外运行catch,则会抛出异常,因为此时iv[3]为零。

您需要告知某个元素的分配何时发生。我怀疑你最好的办法就是从operator []返回一个代理课程,然后有{@ 1}}分配和转换的操作员。