我在理解异常的语法时遇到了麻烦。我有一个必须能够引发异常的类模板map<T>。下面的代码是正确的,用于捕获异常。

try
{
    map<int> m;
    m["everything"] = 42;
}
catch(map<int>::Uninitialized&)
{
    cout << "Uninitialized map element!" << endl;
}

我试图创建派生自runtime_error的类,然后将其从类中抛出。但是看来我的逻辑是有缺陷的。
class Uninitialized : public runtime_error
{
public:
    Uninitialized() : runtime_error("error") {}
};

T operator[] (const char index[]) const
{
    throw Uninitialized();
    return value;
}

最佳答案

您尝试做的事情的基本思想当然是可能的,因此您遇到的确切问题尚不完全清楚。

这是一个快速的演示,可以正常工作,并且大致上可以执行您尝试的操作:

#include <stdexcept>
#include <iostream>

template <class T>
class map {
public:
    class Uninitialized : public std::runtime_error
    {
    public:
        Uninitialized() : runtime_error("error") {}
    };

    T operator[](const char index[]) const
    {
        throw Uninitialized();
        return T();
    }
};

int main(){
    map<int> m;
    try {
        auto foo = m["a"];
    }
    catch (map<int>::Uninitialized &m) {
        std::cerr << "Caught exception:" << m.what()<< "\n";
    }
}

08-20 04:05