C++ 请尝试/正确捕获无序映射异常

C++ 请尝试/正确捕获无序映射异常,c++,exception,boost,try-catch,unordered-map,C++,Exception,Boost,Try Catch,Unordered Map,我得到了这个: // 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<

我得到了这个:

// 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(THIS_IS_NO_KNOWN_KEY);
它给出一个运行时异常,整个过程中止

预防这种情况的最好方法是什么?是否有一个pragma或什么东西,或者我应该用try/catch块或什么东西来包围它

请alex

您可以首先使用无序映射::查找或无序映射::计数来检查密钥是否存在。

您可以首先使用无序映射::查找或无序映射::计数来检查密钥是否存在。

如果您希望在未找到时出现异常,请使用at,如果您不希望异常终止进程,请在某个地方处理该异常;如果要在本地处理,请使用“查找”:

auto found = requestToString.find(key);
if (found != requestToString.end()) {
    // Found it
    do_something_with(found->second);
} else {
    // Not there
    complain("Key was not found");
}
如果未找到异常,则使用at;如果不希望异常终止进程,则在某处处理异常;如果要在本地处理,请使用“查找”:

auto found = requestToString.find(key);
if (found != requestToString.end()) {
    // Found it
    do_something_with(found->second);
} else {
    // Not there
    complain("Key was not found");
}
网站上的文档说明:

抛出:如果不存在std::out类型的异常对象,则该对象超出范围。

位于的文档说明:

抛出:如果不存在std::out \u类型的异常对象,则该对象超出\u范围。

您可以使用无序的\u映射::查找来搜索映射中可能存在或不存在的键

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.
您可以使用无序的_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.


自动前缀到底在做什么?如果在我的解决方案中使用find,我会得到以下结果:错误C2678:二进制“+”:找不到接受“std::string”类型的左操作数的运算符,或者没有可接受的运算符conversion@AlexTape:从用于初始化变量的表达式推断变量的类型。如果您不使用C++11,那么您将不得不编写boost::unordered_map::const_迭代器,或者为此制作一个较短的typedef。自动前缀到底在做什么?如果在我的解决方案中使用find,我会得到以下结果:错误C2678:二进制“+”:找不到接受“std::string”类型的左操作数的运算符,或者没有可接受的运算符conversion@AlexTape:从用于初始化变量的表达式推断变量的类型。如果您不使用C++11,那么您将不得不编写boost::unordered_map::const_迭代器,或者为此制作一个较短的typedef。有没有方法全局声明此捕获?我经常在不同的地方使用。我不想用它来破坏我的代码。。有什么想法吗?@AlexTape:除了终止程序外,没有全局方法来处理异常,因为没有通用的方法来从任意错误中恢复。要么避免一开始就抛出它们,要么在设计中包含它们,找出如何从中恢复,并将catch块放在适当的位置。@找到名为main的函数,然后使用如下内容:int main{try{/*您的代码*/}catchstd::out_of_range{return 1;}@anatolyg hehe非常好的回答:-简单的想法:-@Alex Tape:如果您不想重复代码,请将其放在函数中。hm是否有方法全局声明此捕获?我经常在不同的地方使用。我不想用它来破坏我的代码。。有什么想法吗?@AlexTape:除了终止程序外,没有全局方法来处理异常,因为没有通用的方法来从任意错误中恢复。要么避免一开始就抛出它们,要么在设计中包含它们,找出如何从中恢复,并将catch块放在适当的位置。@找到名为main的函数,然后使用如下内容:int main{try{/*您的代码*/}catchstd::out_of_range{return 1;}@anatolyg hehe非常好的回答:-简单的想法:-@Alex Tape:如果您不想重复代码,请将其放入函数中。是的,可以,但两个函数都不返回引用的字符串,还是我错了?是的,可以,但两个函数都不返回引用的字符串,还是我错了?静态常量枚举???static和const在类型定义中有什么意义吗?不要认为在这种情况下实际上需要const,但无论如何:-枚举上的static和const在这种上下文中是没有意义的。C++不是java。在C++中,枚举是具有限制范围的整数类型。static和const在类型定义中有什么意义吗?不要认为在这种情况下实际上需要const,但无论如何:-枚举上的static和const在这种上下文中是没有意义的。C++不是java。在C++中,枚举是具有限制范围的整数类型。