C++异常语法

C++ Exception syntax

本文关键字:语法 异常 C++      更新时间:2023-10-16

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

假设您正在创建一个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
}