1

我有这个:

// static enum of supported HttpRequest to match requestToString
static const enum HttpRequest {
    GET, 
    POST,
    PUT,
    DELETE,
    OPTIONS,
    HEAD,
    TRACE
};

// typedef for the HttpRequests Map
typedef boost::unordered_map<enum HttpRequest, const char*> HttpRequests;

// define the HttpRequest Map to get static list of supported requests
static const HttpRequests requestToString = map_list_of
    (GET,    "GET")
    (POST,   "POST")
    (PUT,    "PUT")
    (DELETE, "DELETE")
    (OPTIONS,"OPTIONS")
    (HEAD,   "HEAD")
    (TRACE,  "TRACE");

现在如果我打电话

requestToString.at(GET);

没关系,但是如果我调用一个不存在的键

requestToString.at(THIS_IS_NO_KNOWN_KEY);

它给出了一个运行时异常并且整个过程中止..

防止这种情况的最佳方法是什么?是否有编译指示或什么,或者我应该用 try/catch 块或什么来“类 java”围绕它?

好心的亚历克斯

4

4 回答 4

4

如果找不到异常,则使用at它,如果不希望它终止进程,则在某处处理异常;find如果您想在本地处理它,请使用:

auto found = requestToString.find(key);
if (found != requestToString.end()) {
    // Found it
    do_something_with(found->second);
} else {
    // Not there
    complain("Key was not found");
}
于 2012-08-16T15:17:53.783 回答
1

http://www.boost.org/doc/libs/1_38_0/doc/html/boost/unordered_map.html#id3723710-bb上的文档说:

std::out_of_range抛出:如果不存在此类元素,则为异常类型的对象。

于 2012-08-16T15:17:57.850 回答
1

您可以使用它unordered_map::find来搜索可能在地图中也可能不在地图中的键。

find返回一个迭代器,如果未找到该键,则该迭代器为 == end (),如果找到该键,则“指向”一个 std::pair。

未编译的代码:

unordered_map < int, string > foo;
unordered_map::iterator iter = foo.find ( 3 );
if ( iter == foo.end ())
     ; // the key was not found in the map
else
     ; // iter->second holds the string from the map.
于 2012-08-16T18:04:07.570 回答
0

您可以先使用unordered_map::findunordered_map::count检查密钥是否存在。

于 2012-08-16T15:17:04.187 回答