不能抛出C ++中的自己的异常

时间:2016-04-01 14:50:26

标签: c++ exception exception-handling

我正在尝试在C ++中使用自定义异常(Linux,g ++)。 Dictionary.hpp

#ifndef HEADER_DICTIONARY_H
#define HEADER_DICTIONARY_H

#include <map>
#include <string>
#include <stdexcept>

using namespace std;

[...]

class EDictionaryNoLabel : public runtime_error
{
public:
          explicit EDictionaryNoLabel(const string& __arg);
          virtual ~EDictionaryNoLabel() _GLIBCXX_USE_NOEXCEPT;
};

#endif

Dictionary.cpp中我抛出异常(这里是编译失败的地方):

#include <map>
#include <string>
#include "Dictionary.hpp"

using namespace std;

//  map<string, string> dictMap;
Dictionary::Dictionary() {
}

void Dictionary::update(string label, string value) {
        dictMap[label]=value;
}

string Dictionary::read(string label){
        if (0==dictMap.count(label)) {
                throw( EDictionaryNoLabel("label not found") );
        }
        return dictMap[label];
}

void Dictionary::refresh() {
        dictMap.clear();
}

但我无法编译它:

utils/Dictionary.o: In function `Dictionary::read(std::string)':
Dictionary.cpp:(.text+0xbf): undefined reference to `EDictionaryNoLabel::EDictionaryNoLabel(std::string const&)'
Dictionary.cpp:(.text+0xdc): undefined reference to `EDictionaryNoLabel::~EDictionaryNoLabel()'
Dictionary.cpp:(.text+0xe1): undefined reference to `typeinfo for EDictionaryNoLabel'
/tmp/ccXT7dWk.o:(.gcc_except_table+0x68): undefined reference to `typeinfo for EDictionaryNoLabel'
collect2: error: ld returned 1 exit status
make: *** [Test] Error 1

我将我的异常完全标准化为overflow_error(也继承自runtime_error)。

1 个答案:

答案 0 :(得分:2)

一种非常简单有效的方法来推导自己的例外:

struct EDictionaryNoLabel : std::runtime_error
{
    using std::runtime_error::runtime_error;
};

就是这样。

这为您提供了所有标准构造函数和类型安全性。另外,如果需要,可以添加更多方法。

预测:

  

using std::runtime_error::runtime_error;做了什么?

将基类的构造函数的名称复制到此类的名称空间中。它为您提供了所有基类的构造函数,没有额外的代码。