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);

ランタイム例外が発生し、プロセス全体が中止されます..

これを防ぐ最善の方法は何ですか?プラグマがありますか、それとも「Javaのように」try/catchブロックで囲む必要がありますか?

親切にアレックス

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

を使用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 に答える
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 に答える
0

最初に または を使用して、キーが存在するかどうunordered_map::findかを確認できます。unordered_map::count

于 2012-08-16T15:17:04.187 に答える