C ++异常语法

时间:2014-02-25 19:25:32

标签: c++ templates exception exception-handling

我无法理解异常的语法。我有一个类模板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;
}

2 个答案:

答案 0 :(得分:4)

您尝试做的基本想法当然是可能的,所以您遇到的确切问题并不完全清楚。

这是一个可行的快速演示,并且大致完成了您的尝试:

#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";
    }
}

答案 1 :(得分:0)

假设您正在创建map类型(尽管标准库已经提供了一个)。您提供operator[],并希望每次有人尝试访问不存在的密钥时都会抛出异常。

创建例外类:

class unititialized_access : public std::runtime_error
{
    // typical stuff
};

然后,在map<Key, Value>::operator[]内:

if (<key doesn't exist>)
    throw unititialized_error("blah blah");

您通过以下方式捕获异常:

try
{
    m["foo"] = 42;
}
catch (const unitialized_error& e)
{
    // do something
}